R语言如何使用apply类方法合并两个等长列表对应位置的dataframe
最优实现方案
基础R方案(无需额外依赖)
直接用mapply按位置配对两个列表的元素执行合并,性能远高于R层手写for循环:
DesiredOutput_List <- mapply( function(df_a, df_b) merge(df_a, df_b, all = TRUE, by = "SampleID"), list1, list2, SIMPLIFY = FALSE )
注意:如果你实际场景的合并主键是
Barcodes,把上述代码中by参数的取值替换为"Barcodes"即可。
返回结果的顺序和输入列表完全对应,结构和你手写逐个合并的结果完全一致。
高吞吐量方案(推荐大数据量使用)
如果可以引入tidyverse生态的包,dplyr::full_join的合并性能比基础merge高3~10倍(依数据量而定),搭配purrr::map2实现配对迭代,代码更简洁:
library(purrr) library(dplyr) DesiredOutput_List <- map2(list1, list2, ~full_join(.x, .y, by = "SampleID"))
旧尝试问题说明
- Attempt1 用
cbind是直接按行拼接两个表,没有按SampleID主键匹配,不符合合并需求 - 仅用
lapply也可以实现,本质是遍历两个列表的索引,写法不如mapply/map2直观:DesiredOutput_List <- lapply(seq_along(list1), function(idx) { merge(list1[[idx]], list2[[idx]], all = TRUE, by = "SampleID") }) - Attempt3 输出倒序是因为调用
append时指定了插入位置为0,每次都把新合并的表插到列表最开头,把赋值逻辑改为output_list[[x]] <- df_merged即可修正顺序,但手写R层for循环的吞吐量远低于上面的向量化迭代方案。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

