筛选跨不同年份拥有共同ID值的DataFrame行
保留DataFrame中所有年份均有记录的ID对应的行
你有一个包含150000行、1000个ID、覆盖20年的大型DataFrame,目标是仅保留那些在所有年份中都存在记录的ID对应的全部行。
示例数据
x <- structure(list(ID = c(2, 2, 3, 3, 4, 5), Julian = c(40749, 41425, 40749, 41057, 40735, 40743), Year = c(2011, 2012, 2011, 2012, 2011, 2012), Location = c("8300", "Hatchery", "6950", "Hatchery", "8300", "11025"), Distance = c(39625, 31325, 38625, 31325, 39650, 42350)), class = "data.frame", row.names = c(NA, -6L))
示例数据输出:
> x ID Julian Year Location Distance 1 2 40749 2011 8300 39625 2 2 41425 2013 Hatchery 31325 3 3 40749 2011 6950 38625 4 3 41057 2012 Hatchery 31325 5 6 40735 2011 8300 39650 6 12 40743 2011 11025 42350
解决方案
方法1:使用dplyr(简洁高效,适合大型数据)
library(dplyr) # 统计数据覆盖的总年份数 total_years <- n_distinct(x$Year) # 筛选出所有年份都有记录的ID,并保留这些ID的全部行 filtered_df <- x %>% group_by(ID) %>% filter(n_distinct(Year) == total_years) %>% ungroup()
方法2:使用base R(无需额外加载包)
# 获取所有唯一年份 all_years <- unique(x$Year) # 计算每个ID覆盖的年份数,筛选出覆盖所有年份的ID valid_ids <- names(which(tapply(x$Year, x$ID, function(y) length(unique(y))) == length(all_years))) # 保留符合条件的ID对应的行 filtered_df <- x[x$ID %in% valid_ids, ]
两种方法都能高效处理15万行的数据集,dplyr语法更直观,base R则避免了依赖第三方包。
内容的提问来源于stack exchange,提问作者user27808
相关产品推荐
相关产品推荐

