You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:50:30