You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中按位置合并两个文本数据框?

合并两个数据框对应单元格内容(非空值用分号拼接)

问题背景

给定两个结构完全一致的数据框u1和u2,需要将对应位置的单元格内容合并:非空值用;连接,空值则保留为空。

数据框定义

u1 <- structure(list(s1 = c("", "", "MO;SP", ""), s2 = c("", "", "", 
""), s3 = c("", "MO;SP", "", "")), row.names = c("g1", "g2", 
"g3", "g4"), class = "data.frame")

u2 <- structure(list(s1 = c("", "", "snv", ""), s2 = c("", "", "", 
""), s3 = c("", "snv", "", "")), row.names = c("g1", "g2", "g3", 
"g4"), class = "data.frame")

原始输出

> u1; u2
      s1 s2    s3
g1               
g2          MO;SP
g3 MO;SP         
g4               
    s1 s2  s3
g1           
g2        snv
g3 snv       
g4 

期望结果

s1  s2  s3
g1  
g2          MO;SP;snv
g3  MO;SP;snv   
g4  

解决方案

方法1:使用mapply实现

你猜测的mapply完全可行,核心是对两个数据框的对应列逐元素执行拼接逻辑:

首先定义拼接函数,处理空值和非空值的组合情况:

concat_cells <- function(x, y) {
  if (x == "" && y == "") {
    return("")
  } else if (x == "") {
    return(y)
  } else if (y == "") {
    return(x)
  } else {
    paste(x, y, sep = ";")
  }
}

然后用mapply遍历两个数据框的列,再转换回数据框并修正行、列名:

result <- as.data.frame(mapply(concat_cells, u1, u2), row.names = rownames(u1))
colnames(result) <- colnames(u1)

运行后得到的结果与期望一致:

s1 s2          s3
g1                        
g2                MO;SP;snv
g3 MO;SP;snv               
g4                        

方法2:向量化操作(更高效)

利用数据框的矩阵特性,直接用向量化逻辑处理,避免循环,适合大尺度数据:

# 转换为矩阵便于向量化操作
m1 <- as.matrix(u1)
m2 <- as.matrix(u2)

# 拼接逻辑:按空值情况分支处理
result_mat <- ifelse(m1 == "" & m2 == "", "", 
                     ifelse(m1 == "", m2, 
                            ifelse(m2 == "", m1, paste(m1, m2, sep = ";"))))

# 转回数据框
result <- as.data.frame(result_mat, row.names = rownames(u1))

方法3:Tidyverse风格(dplyr+purrr)

如果熟悉tidyverse生态,用purrr::map2逐列处理更符合风格:

library(dplyr)
library(purrr)

# 复用之前定义的concat_cells函数
result <- map2_dfc(u1, u2, concat_cells) %>% 
  `rownames<-`(rownames(u1))

内容的提问来源于stack exchange,提问作者garcesj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:45:11