2017-04-24 8 views
1

年が連続していない行を削除しようとしているデータフレームがあります。ここでデータがRで連続していない行を削除するdplyr

は私のデータフレームのサンプルです:

  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は、連続した年に沿って満たされています。 Ogandoの2013〜2015 SPRPのシーケンスは連続した年数では満たされません。役立つかもしれない

要素は年が連続していないが、velo_diffは0.0

となる各シーケンスは、誰もがこれを行う方法を知っているだろうということですか?すべての助けに感謝します。

答えて

1

あなたは、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

は、我々が使用できる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 
関連する問題