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

如何在长格式纵向数据中筛选含全部4次测量的ID行

解决长格式纵向数据筛选全测量ID的问题

我来帮你搞定这个筛选问题~首先得先搞清楚你之前代码报错的原因:

你用table(data$id) == 4得到的是一个对应每个唯一ID是否满足4次记录的逻辑向量,它的长度是你数据里唯一ID的数量(比如你报错里的828个),但subset()函数需要的是和你的原始数据行数(2637行)完全一致的逻辑索引,两者长度不匹配,所以才会抛出那个错误。

下面给你几种靠谱的解决方案,都能保留长格式数据,完美筛选出拥有全部4次Wave记录的参与者:

方法1:用dplyr(代码最直观,推荐)

如果你已经装了dplyr包,直接按ID分组后筛选每组行数为4的记录就行:

library(dplyr)

all.data <- data %>%
  group_by(ID) %>%
  filter(n() == 4) %>%
  ungroup()

这里n()会自动计算每个ID对应的行数,只有行数刚好是4的分组会被保留,完全符合你的需求。

方法2:Base R原生方法(不用装额外包)

先把符合条件的ID找出来,再用这个列表去筛选原数据:

# 第一步:提取所有有4次记录的ID
valid_ids <- names(table(data$ID))[table(data$ID) == 4]
# 第二步:筛选原数据中ID在valid_ids里的行
all.data <- subset(data, ID %in% valid_ids)

这种方法先拿到合格ID的名单,再用%in%来匹配,这样生成的逻辑向量长度就和原始数据行数一致了,不会再报错。

方法3:用data.table(大数据量下速度更快)

如果你的数据后续还要做大量处理,data.table的效率会更高:

library(data.table)
setDT(data) # 把数据转换成data.table格式
all.data <- data[, .SD[.N == 4], by = ID]

.N是data.table里的特殊变量,代表每个分组的行数,.SD指代当前分组的所有数据,这样就只保留了行数为4的分组。

最后你可以用table(all.data$ID)检查一下结果,所有ID的计数都应该是4,确认筛选正确~

内容的提问来源于stack exchange,提问作者Eslie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:50:02