如何在R语言中从两个数据集移除关联观测值
解决方案
要实现这个按行匹配移除的逻辑,可以借助dplyr包处理分组计数与筛选,具体步骤如下:
步骤1:统计data_1中每个(ID, week)组合的出现次数
这一步用来确定每个(ID, week)需要从data_2中移除的记录数量:
library(dplyr) # 统计data_1中各(ID, week)的行数 remove_counts <- data_1 %>% group_by(ID, week) %>% summarise(remove_n = n(), .groups = "drop")
步骤2:给data_2的每个(ID, week)分组添加行号
通过行号区分同一组内的不同记录,方便后续精准筛选:
data_2_with_rowid <- data_2 %>% group_by(ID, week) %>% mutate(row_num = row_number()) %>% ungroup()
步骤3:关联计数并筛选保留的记录
将data_2的行号与需要移除的数量对比,保留行号大于移除数量的记录:
result <- data_2_with_rowid %>% left_join(remove_counts, by = c("ID", "week")) %>% # 对data_1中不存在的ID-week组合,移除数量设为0 mutate(remove_n = replace_na(remove_n, 0)) %>% filter(row_num > remove_n) %>% select(ID, speciale, week) # 保留目标列
运行代码后得到的result即为期望输出:
> result # A tibble: 2 × 3 ID speciale week <dbl> <dbl> <chr> 1 1 80001 0109 2 1 80001 0212
该方法完全遵循“data_1每一行对应移除data_2一行匹配记录”的规则,无需使用distinct(),适配复杂数据集场景。
内容的提问来源于stack exchange,提问作者user13069688
相关产品推荐
相关产品推荐

