在R语言中合并同列结构的两个DataFrame并拼接对应列内容
在R中批量合并两个DataFrame的对应列内容
假设我们有两个结构匹配的DataFrame,其中一个存储数值,另一个存储对应的百分比字符串,需要将对应列的内容拼接成「数值 (百分比)」的格式,以下是两种高效实现方式:
方法一:Base R 实现(无需额外包)
利用mapply批量处理每一列,同时保留id列:
# 示例数据 a <- data.frame( id = seq(1, 4), a = c(0, 0, 1, 1), b = c(3, 3, 1, 1) ) b <- data.frame( id = seq(1, 4), a = c("0%", "0%", "50%", "50%"), b = c("37.5%", "37.5%", "12.5%", "12.5%") ) # 获取需要处理的列名(排除id) cols <- setdiff(names(a), "id") # 批量拼接对应列 result_list <- mapply(function(x, y) paste(x, paste0("(", y, ")"), sep = " "), a[cols], b[cols]) # 转换为DataFrame并合并id列 result <- cbind(a["id"], as.data.frame(result_list))
方法二:dplyr 实现(简洁高效,适合多列场景)
使用dplyr的across函数批量处理所有目标列,代码更简洁:
library(dplyr) result <- a %>% left_join(b, by = "id", suffix = c("_num", "_pct")) %>% mutate(across(ends_with("_num"), ~paste(., get(gsub("_num", "_pct", cur_column())), sep = " ("), .names = "{gsub('_num', '', .col)}")) %>% mutate(across(ends_with(")"), ~paste0(., ")"))) %>% select(id, all_of(cols))
两种方法都能处理任意数量的列,只需保证两个DataFrame的列名(除id外)完全匹配、行数一致即可。
内容的提问来源于stack exchange,提问作者prdel99
相关产品推荐
相关产品推荐

