【问题标题】:Select last two rows of each group with certain value on a variable in R在R中的变量上选择具有特定值的每组的最后两行
【发布时间】:2019-05-03 15:04:50
【问题描述】:

如果可能,我想选择每个组 (ID) 的 最后两行,这些行在我的结果变量(结果)上具有有效值(即非 NA)。

示例数据如下所示:

df <- read.table(text="
                      ID       outcome
                 1    800033   3
                 2    800033   3
                 3    800033   NA   
                 4    800033   2  
                 5    800033   1  
                 15   800076   2
                 16   800076   NA
                 17   800100   4     
                 18   800100   4  
                 19   800100   4  
                 20   800100   3   
                 30   800125   2   
                 31   800125   1   
                 32   800125   NA", header=TRUE)

如果参与者在我的结果变量上没有两个有效值(例如,ID == 800076),我仍然希望保留该组 (ID) 的最后两行。应删除所有其他行。

因此,我的最终数据集如下所示:

     ID       outcome
4    800033   2  
5    800033   1  
15   800076   2
16   800076   NA
19   800100   4  
20   800100   3   
30   800125   2   
31   800125   1

非常感谢任何有关如何执行此操作的建议!

【问题讨论】:

  • 只是一个快速的双倍。如果最后一行是 NA 结果,你要删除那些吗?如果是这样,16 是不正确的

标签: r dplyr


【解决方案1】:

我们可以为slice 设置一个if 条件并检查行数是否大于2 并根据该条件选择行。

library(dplyr)
df %>%
  group_by(ID) %>%
  slice(if (n() > 2) tail(which(!is.na(outcome)), 2) else 1:n())

#      ID outcome
#   <int>   <int>
#1 800033       2
#2 800033       1
#3 800076       2
#4 800076      NA
#5 800100       4
#6 800100       3
#7 800125       2
#8 800125       1

【讨论】:

    【解决方案2】:

    我们可以通过dplyr 做到这一点

    library(dplyr)
    df %>% 
       group_by(ID) %>% 
       filter(n() <=2 | !is.na(outcome) ) %>%
       slice(tail(row_number(), 2))
    # A tibble: 8 x 2
    # Groups:   ID [4]
    #      ID outcome
    #   <int>   <int>
    #1 800033       2
    #2 800033       1
    #3 800076       2
    #4 800076      NA
    #5 800100       4
    #6 800100       3
    #7 800125       2
    #8 800125       1
    

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 2019-09-22
      • 2020-10-09
      • 2021-01-26
      • 2011-07-04
      • 2023-03-30
      • 2015-06-06
      • 1970-01-01
      相关资源
      最近更新 更多