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

筛选跨不同年份拥有共同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:14:53