在R中基于多列条件筛选重复ID对应行的技术求助
R中按ID分组提取列目标值的解决方案
需求:针对重复ID的行,每个列若该ID组内存在0则保留0;无0则保留组内任意非0值。
示例数据构造
df <- data.frame( ID = c("001", "002", "002", "003", "003", "003"), A = c(1, 0, 1, 0, 1, 0), B = c(1, 1, 0, 1, 0, 0), C = c(1, 0, 0, 1, 1, 1) )
方法一:dplyr包实现(推荐,适配大量列场景)
library(dplyr) result <- df %>% group_by(ID) %>% summarise(across(-ID, ~ifelse(any(.x == 0), 0, first(.x)))) %>% ungroup() print(result)
运行结果:
# A tibble: 3 × 4 ID A B C <chr> <dbl> <dbl> <dbl> 1 001 1 1 1 2 002 0 0 0 3 003 0 0 1
逻辑说明:
group_by(ID):按ID对数据分组across(-ID, ...):对所有非ID列执行自定义判断- 自定义函数:检查组内是否存在0,存在则返回0,否则返回组内第一个非0值(因组内无0,所有值一致)
方法二:Base R实现(无需额外包)
result_base <- aggregate(. ~ ID, data = df, FUN = function(x) ifelse(any(x == 0), 0, x[1])) print(result_base)
运行结果与上述一致,核心逻辑是通过aggregate按ID分组,对每列执行相同的条件判断。
内容的提问来源于stack exchange,提问作者Roq
相关产品推荐
相关产品推荐

