为DataFrame添加合并重复ID对应国家的新列
解决同ID对应国家合并的问题
我明白你想要把DataFrame中相同ID对应的所有Country合并成一个条目对吧?你之前用的ifelse方法逻辑不太对,因为它没有针对ID进行分组聚合,咱们换个更直接的方式来实现。
首先先把你的示例数据明确下来:
df <- data.frame( ID = c(55,55,55,98,98,98,65,67,84,22,22), Country = c("Poland", "Romania", "France", "Spain", "Portugal", "UK", "Germany", "Luxembourg", "Greece", "Estonia", "Lithuania") )
方法一:用dplyr包(推荐,代码更直观)
dplyr的分组聚合非常适合这种场景,步骤很清晰:
- 按
ID分组 - 把每个组里的
Country用逗号(或你想要的分隔符)连接起来
代码如下:
library(dplyr) result_df <- df %>% group_by(ID) %>% summarize(Countries = paste(Country, collapse = ", ")) %>% ungroup()
运行后你会得到目标输出:
ID Countries <dbl> <chr> 1 22 Estonia, Lithuania 2 55 Poland, Romania, France 3 65 Germany 4 67 Luxembourg 5 84 Greece 6 98 Spain, Portugal, UK
方法二:用Base R的aggregate函数
如果你不想加载额外的包,用base R的aggregate也能实现:
result_df_base <- aggregate(Country ~ ID, data = df, FUN = function(x) paste(x, collapse = ", ")) colnames(result_df_base)[2] <- "Countries" # 把列名改成你想要的
这个结果和上面的dplyr方法完全一致。
为什么你之前的代码没生效?
你写的ifelse(df[duplicated(df$ID) | duplicated(df$ID, fromLast = TRUE),], paste('Countries', df$Country), NA)逻辑有问题:它只是判断哪些行是重复ID的行,但没有对这些行进行分组合并,反而会生成很多零散的结果,自然达不到你想要的聚合效果啦。
内容的提问来源于stack exchange,提问作者Biostatician
相关产品推荐
相关产品推荐

