如何在长格式纵向数据中筛选含全部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
相关产品推荐
相关产品推荐

