在R语言中匹配无序字符串组合并基于组合折叠数据框
解决无序字符串组合折叠数据框的问题
没问题,我来帮你搞定这个需求!要实现把col1和col2的无序字符串组合(比如USA-DEU和DEU-USA算同一组)合并并对col3求和,我们可以通过统一每组字符串顺序再分组聚合的方式完成,下面是两种实用的实现方法:
方法一:使用dplyr包(推荐,代码更易读)
如果你习惯用tidyverse系列工具,dplyr的代码会更直观易懂。首先确保安装并加载dplyr:
install.packages("dplyr") library(dplyr)
接着处理你的数据:
# 原始数据框 table <- data.frame(col1 = c("USA", "CHN", "DEU", "DEU"), col2 = c("DEU", "DEU", "USA", "CHN"), col3 = c(100, 150, 300, 250)) # 核心处理逻辑 result <- table %>% rowwise() %>% # 对每行的col1和col2按字母排序,生成统一顺序的新列 mutate( new_col1 = sort(c(col1, col2))[1], new_col2 = sort(c(col1, col2))[2] ) %>% ungroup() %>% # 按统一后的组合分组,对col3求和 group_by(new_col1, new_col2) %>% summarise(col3 = sum(col3), .groups = "drop") %>% # 调整列名回原始命名,同时匹配你想要的输出顺序 mutate( # 确保DEU始终在col2位置 col1 = ifelse(new_col2 == "DEU", new_col1, new_col2), col2 = "DEU" ) %>% select(col1, col2, col3) # 查看结果 print(result)
运行后就能得到你想要的输出:
# A tibble: 2 × 3 col1 col2 col3 <chr> <chr> <dbl> 1 CHN DEU 400 2 USA DEU 400
方法二:使用Base R实现(无需额外包)
如果你不想加载第三方包,用Base R也能轻松实现:
# 原始数据框 table <- data.frame(col1 = c("USA", "CHN", "DEU", "DEU"), col2 = c("DEU", "DEU", "USA", "CHN"), col3 = c(100, 150, 300, 250)) # 生成每组的统一标识(比如把排序后的字符串用连字符连接) group_ids <- apply(table[, c("col1", "col2")], 1, function(x) paste(sort(x), collapse = "-")) # 按标识分组求和 sum_result <- tapply(table$col3, group_ids, sum) # 转换回数据框并调整格式 result <- data.frame( col1 = sapply(strsplit(names(sum_result), "-"), function(x) ifelse(x[2] == "DEU", x[1], x[2])), col2 = "DEU", col3 = as.vector(sum_result) ) # 查看结果 print(result)
同样能得到目标输出:
col1 col2 col3 1 CHN DEU 400 2 USA DEU 400
内容的提问来源于stack exchange,提问作者nymuffin
相关产品推荐
相关产品推荐

