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

R语言中如何对对象列表顺序执行二元函数实现多数据框按列合并

R语言多数据框按指定列合并实现方案

问题背景

需要将多个数据框基于gene列完成合并,示例数据如下(原始示例存在向量长度与数据框行数不匹配的笔误,已做修正):

a <- data.frame(gene = c("a", "b", "c"), old = c(1:3))
b <- data.frame(gene = c("c", "b", "a"), new = c(10:12))
c <- data.frame(gene = c("a", "c", "a"), bet = c(100:102))

如果所有数据框的gene顺序完全一致,可以使用do.call(cbind, list(a, b, c))合并后再做数据清洗,但实际场景中各数据框的gene顺序不同,且部分数据框可能存在缺失的gene,因此需要使用dplyr::full_join完成合并。

需求是找到一个功能类似do.call的函数,接收三类参数:

  • 仅接收两个入参的目标函数what
  • 会被依次传入what的参数列表
  • 需要传递给what的额外固定参数
    使得如下示例中all.equal(tmp2, tmp3)的判定结果为TRUE:
tmp1 <- dplyr::full_join(a, b, by = "gene")
tmp2 <- dplyr::full_join(tmp1, c, by = "gene")
tmp3 <- magic_function(dplyr::full_join, list(a, b, c), by = "gene")

实现方案

purrr包的reduce函数完全符合上述要求,除了自定义匿名函数的写法外,还可以直接通过reduce的可选参数传递固定参数,进一步简化代码:

# 简化写法,无需自定义匿名函数
tmp3 <- purrr::reduce(list(a, b, c), dplyr::full_join, by = "gene")

该执行逻辑和多次嵌套调用full_join完全一致,最终得到的tmp3和tmp2完全相同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:45:04