【问题标题】:Merge dataframes stored in two lists of the same length合并存储在两个相同长度列表中的数据帧
【发布时间】:2021-09-21 21:42:29
【问题描述】:

我有两个长度相等的大型数据帧列表。我想将Dataframe1(来自list1)与Dataframe1(来自list2)和Dataframe2(来自list1)与Dataframe2(来自list2)等合并......

下面是一个最小的可重现示例和一些尝试。

#### EXAMPLE
#Create Dataframes
df_1 <- data.frame(c("Bah",NA,2,3,4),c("Bug",NA,5,6,NA))
df_2 <- data.frame(c("Blu",7,8,9,10),c(NA,NA,NA,12,13))
df_3 <- data.frame(c("Bah",NA,21,32,43),c("Rgh",NA,51,63,NA))
df_4 <- data.frame(c("Gar",7,8,9,10),c("Ghh",NA,NA,121,131))

#Create Lists
list1 <- list(df_1,df_2)
list2 <- list(df_3,df_4)

#Set column and row names for each dataframe
colnames(list1[[1]]) <-  c("SampleID","Measure1","Measure2","Measure3","Measure4")
colnames(list1[[2]]) <-  c("SampleID","Measure1","Measure2","Measure3","Measure4")
colnames(list2[[1]]) <-  c("SampleID","Measure1","Measure2","Measure3","Measure4")
colnames(list2[[2]]) <-  c("SampleID","Measure1","Measure2","Measure3","Measure4")

rownames(list1[[1]]) <-  c("1","2")
rownames(list1[[2]]) <-  c("1","2")
rownames(list2[[1]]) <-  c("1","2")
rownames(list2[[2]]) <-  c("1","2")

我想要的输出是一个与输入列表长度相同的列表,但每个数据帧按位置合并到一个数据帧中。以下为数据帧和列表产生了我想要的输出,但吞吐量很低。

#### DESIRED OUTPUT
DesiredOutput_DF1_Format <- merge(list1[[1]],list2[[1]], all = TRUE, by = "SampleID")
DesiredOutput_DF2_Format <- merge(list1[[2]],list2[[2]], all = TRUE, by = "SampleID")
DesiredOutput_List <- list(DesiredOutput_DF1_Format, DesiredOutput_DF2_Format)

如何使用类似应用的方法以高吞吐量的方式生成所需格式的输出列表?

#### ATTEMPTS
#Attempt1:
attempt1 <- mapply(cbind, list1, list2, simplify=FALSE)

#Attempt2: 
My instinct is to use `lapply` but i cant figure how to make it iterate through two lists simultaneously.

#Attempt3: Works but the order of the output list appears inverted. This is not intuitive, though it is easily corrected... There has to be a cleaner way.
output_list <- list()
dataset_iterator <- 1:length(list1)

for (x in dataset_iterator) {
    df1 <- data.frame(list1[[x]])
    df2 <- data.frame(list2[[x]])
    df_merged <- data.frame(merge(df1, df2, by = "Barcodes", all=TRUE))
    output_list <- append(output_list, list(df_merged), 0)

【问题讨论】:

    标签: r


    【解决方案1】:

    根据显示的代码,我们可能需要Map(或mapplySIMPLIFY = FALSE

    out <- Map(merge, list1, list2, MoreArgs = list(all = TRUE, by = "SampleID"))
    

    -检查预期输出

    > identical(DesiredOutput_List, out)
    [1] TRUE
    

    或使用tidyverse

    library(purrr)
    library(dplyr)
    map2(list1, list2, full_join, by = "SampleID")
    

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 2020-04-10
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2013-09-29
      • 2012-12-15
      • 1970-01-01
      • 2017-11-30
      相关资源
      最近更新 更多