R语言如何筛选拥有多年观测数据的ID对应的所有行?
报错原因
你的代码报错主要有两个问题:
- 循环起始值设置错误:i从1开始时,
i-1=0不存在对应的行,先触发了下标越界问题 mutate()函数调用格式错误:dplyr的mutate第一个参数必须传入要操作的数据框,你写的mutate(dum = ...)没有传入数据框参数,最终解析时传入的是前面运算得到的数值向量,才会提示没有对应numeric类的mutate方法。
另外你的实现逻辑不需要用循环,R里有更简洁的向量化操作方案,效率也更高。
最简实现方案(dplyr)
这是最符合你需求的写法,直接按ID分组筛选即可:
# 加载dplyr包,如果你用的是tidyverse直接加载tidyverse也可以 library(dplyr) # 处理数据 result <- agg_data_condensed %>% group_by(ID) %>% filter(n_distinct(Year) > 1) %>% # 保留不重复年份数大于1的ID的所有行 ungroup()
运行后你提供的示例数据会自动剔除ID=3的所有行,保留ID=1、ID=2的全部6行记录,完全符合你的要求。
基础R实现方案(不需要加载第三方包)
如果你不想用dplyr,也可以用基础R语法实现:
# 统计每个ID对应的不重复年份数量 year_count <- tapply(agg_data_condensed$Year, agg_data_condensed$ID, function(x) length(unique(x))) # 提取符合条件的ID keep_id <- names(year_count[year_count > 1]) # 筛选对应行 result <- agg_data_condensed[agg_data_condensed$ID %in% keep_id, ]
内容的提问来源于stack exchange,提问作者z_11122
相关产品推荐
相关产品推荐

