如何使用dplyr按ID分组选取每组中到第一个5(含)的行?
使用dplyr实现按ID保留到第一个出现5的行
你可以通过dplyr的分组和切片操作实现需求,具体代码如下:
首先定义原始数据:
df1 <- data.frame(ID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2), var1 = c(0, 2, 3, 4, 2, 5, 6, 10, 11, 0, 1, 2, 1, 5, 7, 10))
核心处理代码:
library(dplyr) # 按ID分组,保留从第一行到第一个出现5(含)的所有行 result <- df1 %>% group_by(ID) %>% slice(1:which(var1 == 5)[1]) %>% ungroup() # 查看结果 print(result)
代码说明:
group_by(ID):将数据按ID分组,确保每个ID组内独立处理slice(1:which(var1 == 5)[1]):which(var1 == 5)返回当前组中var1等于5的所有行索引[1]提取第一个索引,即第一次出现5的位置1:索引选取从第一行到该位置的所有行,包含出现5的那一行
ungroup():取消分组,将结果转换为普通数据框格式
扩展:处理无5的分组
如果数据中存在某个ID组未出现5的情况,想要保留该组全部行,可以修改代码如下:
result <- df1 %>% group_by(ID) %>% slice(1:ifelse(is.na(which(var1 == 5)[1]), n(), which(var1 == 5)[1])) %>% ungroup()
这里通过ifelse判断,若未找到5(which返回NA),则用n()获取当前组总行数,保留全部行。
内容的提问来源于stack exchange,提问作者Meg.abytes
相关产品推荐
相关产品推荐

