У меня есть фрейм данных, где я пытаюсь удалить строки, где год не является последовательным.

Вот пример моего фрейма данных:

         Name       Year Position Year_diff  FBv     ind1  velo_diff
1     Aaron Heilman 2005       RP         2  90.1    TRUE      0.0
2     Aaron Heilman 2003       SP         NA 89.4      NA      0.0 
3     Aaron Laffey  2010       RP         1  86.8    TRUE     -0.6 
4     Aaron Laffey  2009       SP         NA 87.4      NA      0.0
5     Alexi Ogando  2015       RP         2  94.5    TRUE      0.0
6     Alexi Ogando  2013       SP         NA 93.4   FALSE      0.0
7     Alexi Ogando  2012       RP         1  97.0    TRUE      1.9
8     Alexi Ogando  2011       SP         NA 95.1      NA      0.0

Ожидаемый результат должен быть:

          Name      Year  Position Year_diff  FBv    ind1   velo_diff
3     Aaron Laffey  2010       RP         1   86.8    TRUE    -0.6
4     Aaron Laffey  2009       SP         NA  87.4      NA     0.0
7     Alexi Ogando  2012       RP         1   97.0    TRUE     1.9
8     Alexi Ogando  2011       SP         NA  95.1      NA     0.0

Причина, по которой Алекси Огандо в 2011-2012 годах все еще существует, заключается в том, что его последовательность SP - RP соответствует годам подряд. Последовательность Огандо в 2013-2015 годах SP - RP не встречается с последовательными годами.

Элемент, который может помочь, состоит в том, что каждая последовательность, где годы не последовательны, velo_diff будет 0.0

Кто-нибудь знает, как это сделать? Вся помощь приветствуется.

1
Julien 24 Апр 2017 в 07:54

2 ответа

Лучший ответ

Вы можете сгруппировать filter, проверяя, существует ли последующий или предыдущий год и соответствует ли Position соответственно:

library(dplyr)

df <- read.table(text = 'Name       Year Position Year_diff  FBv     ind1  velo_diff
1     "Aaron Heilman" 2005       RP         2  90.1    TRUE      0.0
2     "Aaron Heilman" 2003       SP         NA 89.4      NA      0.0 
3     "Aaron Laffey"  2010       RP         1  86.8    TRUE     -0.6 
4     "Aaron Laffey"  2009       SP         NA 87.4      NA      0.0
5     "Alexi Ogando"  2015       RP         2  94.5    TRUE      0.0
6     "Alexi Ogando"  2013       SP         NA 93.4   FALSE      0.0
7     "Alexi Ogando"  2012       RP         1  97.0    TRUE      1.9
8     "Alexi Ogando"  2011       SP         NA 95.1      NA      0.0', header = TRUE)

df %>% group_by(Name) %>% 
    filter(((Year - 1) %in% Year & Position == 'RP') | 
           ((Year + 1) %in% Year & Position == 'SP'))

#> Source: local data frame [4 x 7]
#> Groups: Name [2]
#> 
#>           Name  Year Position Year_diff   FBv  ind1 velo_diff
#>         <fctr> <int>   <fctr>     <int> <dbl> <lgl>     <dbl>
#> 1 Aaron Laffey  2010       RP         1  86.8  TRUE      -0.6
#> 2 Aaron Laffey  2009       SP        NA  87.4    NA       0.0
#> 3 Alexi Ogando  2012       RP         1  97.0  TRUE       1.9
#> 4 Alexi Ogando  2011       SP        NA  95.1    NA       0.0
1
alistaire 24 Апр 2017 в 05:36

Мы можем использовать data.table

library(data.table)
setDT(df1)[df1[, .I[abs(diff(Year))==1], .(Name, grp  = cumsum(Position == "RP"))]$V1]
#           Name Year Position Year_diff  FBv ind1 velo_diff
#1: Aaron Laffey 2010       RP         1 86.8 TRUE      -0.6
#2: Aaron Laffey 2009       SP        NA 87.4   NA       0.0
#3: Alexi Ogando 2012       RP         1 97.0 TRUE       1.9
#4: Alexi Ogando 2011       SP        NA 95.1   NA       0.0

Или используя ту же методологию с dplyr

library(dplyr)
df1 %>%
   group_by(Name, grp = cumsum(Position == "RP")) %>%  
   filter(abs(diff(Year))==1) %>% #below 2 steps may not be needed
   ungroup() %>%
   select(-grp)
# A tibble: 4 × 7
#           Name  Year Position Year_diff   FBv  ind1 velo_diff
#          <chr> <int>    <chr>     <int> <dbl> <lgl>     <dbl>
#1 Aaron Laffey  2010       RP         1  86.8  TRUE      -0.6
#2 Aaron Laffey  2009       SP        NA  87.4    NA       0.0
#3 Alexi Ogando  2012       RP         1  97.0  TRUE       1.9
#4 Alexi Ogando  2011       SP        NA  95.1    NA       0.0
1
akrun 24 Апр 2017 в 06:26
43580047