在Base R中查找存在多年份观测记录的ID
解决方法:用Base R找出存在多年份观测的ID
首先把示例数据转换成可直接运行的R对象:
df <- data.frame( ID = c(6,6,6,6,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8), year = c(2015,2015,2015,2015,2018,2018,2018,2018,2018,2015,2015,2015,2015,2015,2015,2015,2015,2021,2021) )
下面是几种纯Base R的简便实现方式:
方法1:使用aggregate()
通过分组计算每个ID对应的唯一年份数量,再筛选数量大于1的ID:
# 计算每个ID的唯一年份数 year_count <- aggregate(year ~ ID, data = df, FUN = function(x) length(unique(x))) # 筛选出有多个年份的ID multi_year_ids <- year_count$ID[year_count$year > 1] multi_year_ids # 输出结果:[1] 6 8
方法2:使用tapply()
tapply()按ID分组处理year列,返回每个ID的唯一年份数,再筛选目标ID:
counts <- tapply(df$year, df$ID, function(x) length(unique(x))) multi_year_ids <- names(counts[counts > 1]) # 按需转成数值型 multi_year_ids <- as.numeric(multi_year_ids) multi_year_ids # 输出结果:[1] 6 8
方法3:使用by()
by()按ID分组后,直接判断每组是否包含多个唯一年份,再提取对应ID:
# 分组判断是否有多个不同年份 has_multi_year <- by(df$year, df$ID, function(x) length(unique(x)) > 1) # 提取结果为TRUE的ID multi_year_ids <- as.numeric(names(has_multi_year[has_multi_year])) multi_year_ids # 输出结果:[1] 6 8
这些方法都无需依赖扩展包,比循环实现更简洁高效。
内容的提问来源于stack exchange,提问作者Olo Eopia
相关产品推荐
相关产品推荐

