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
相关产品推荐
相关产品推荐

