在R中的变量上选择具有特定值的每个组的最后两行

时间:2019-05-03 15:04:50

标签: r dplyr

如果可能的话,我想选择每个组(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

任何有关如何执行此操作的建议都将受到赞赏!

2 个答案:

答案 0 :(得分:1)

我们可以为if设置一个slice条件,并检查行数是否大于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

答案 1 :(得分:0)

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