如果可能的话,我想选择每个组(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
任何有关如何执行此操作的建议都将受到赞赏!
答案 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