R语言按唯一ID分组并将对应列转为0/1的实现求助
解决R语言中按ID聚合0/1列(任意行有1则保留1)的问题
核心解法(dplyr)
你需要的是按id分组后,对每个0/1列取最大值——只要该ID下任意一行的列值为1,最大值就是1;全为0则结果为0,正好匹配需求。用dplyr可以快速实现:
library(dplyr) # 你的原始数据 df <- data.frame("id"=c("1","1","1","2","3","3"), "1"=c(1,0,0,1,0,0), "2"=c(0,1,0,1,0,0)) # 数据处理 result_df <- df %>% group_by(id) %>% summarise(across(everything(), max)) # 查看结果 result_df
运行后得到的结果:
# A tibble: 3 × 3 id `1` `2` <chr> <dbl> <dbl> 1 1 1 1 2 2 1 1 3 3 0 0
基础R替代方案
如果不想加载dplyr包,用aggregate函数也能实现同样效果:
result_df_base <- aggregate(. ~ id, data = df, FUN = max)
为什么你的之前尝试没成功?
group_by(id) %>% tally()只会统计每个ID的行数,不会保留其他列的计算结果;distinct()需要整行完全重复才会去重,而你同一ID下的行因为列值不同,所以无法去重;- 先去重再求和的思路不对,应该直接对分组后的列取最大值(或求和后转成0/1,不过最大值更直接)。
内容的提问来源于stack exchange,提问作者Elina
相关产品推荐
相关产品推荐

