【问题标题】:Removing rows based where data isn't sequential in R, dplyr删除基于数据在R中不连续的行,dplyr
【发布时间】:2017-04-24 04:54:16
【问题描述】:

我有一个数据框,我试图在其中删除年份不连续的行。

这是我的数据框示例:

         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

Alexi Ogando 2011-2012 仍然存在的原因是因为他的SPRP 的序列符合连续年份。 Ogando 的 2013-2015 年 SPRP 序列连续几年没有得到满足。

一个可能有帮助的元素是年份不连续的每个序列,velo_diff 将是0.0

有人知道怎么做吗?感谢所有帮助。

【问题讨论】:

    标签: r dplyr


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      我们可以使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 2021-12-03
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2021-08-29
        相关资源
        最近更新 更多