如何在R中基于SERIAL列出现次数筛选符合条件的数据集
筛选长格式数据集中符合出现次数要求的记录
我有一个长格式数据集,包含30个时间点的问卷数据。分析需求是保留那些至少完成15次问卷的参与者的所有记录,也就是要筛选出SERIAL列中出现次数≥15的所有行。
我尝试用dplyr的count()函数查看了每个SERIAL的出现次数,但不知道怎么基于这个结果去筛选原数据集,试了几种方法都没成功,最后用以下base R代码实现了需求:
DF$trim <- ifelse((ave(DF$SERIAL, DF$SERIAL, FUN = length) >= 15),1,0) DF$total <- ave(DF$SERIAL, DF$SERIAL, FUN = length) DF$total <- as.numeric(DF$total) NEW_DF <- subset(DF, DF$total >= 15)
简化的base R写法
其实可以精简代码,不需要额外创建多余的列,直接通过ave()生成每个SERIAL的出现次数后筛选:
NEW_DF <- DF[ave(DF$SERIAL, DF$SERIAL, FUN = length) >= 15, ]
用dplyr实现的两种方案
如果想用dplyr完成这个需求,推荐两种更直观的写法:
方法1:分组后直接筛选
按SERIAL分组,利用n()获取组内行数,直接筛选符合条件的组:
library(dplyr) NEW_DF <- DF %>% group_by(SERIAL) %>% filter(n() >= 15) %>% ungroup() # 可选,完成筛选后取消分组状态
方法2:先统计有效ID再筛选
先通过count()得到符合次数要求的SERIAL列表,再用这个列表去原数据中筛选:
library(dplyr) # 第一步:筛选出符合条件的SERIAL valid_serials <- DF %>% count(SERIAL) %>% filter(n >= 15) %>% pull(SERIAL) # 第二步:保留原数据中属于有效SERIAL的记录 NEW_DF <- DF %>% filter(SERIAL %in% valid_serials)
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

