【问题标题】:Joining dataframes from lists of unequal length从长度不等的列表中加入数据帧
【发布时间】:2019-11-19 12:28:27
【问题描述】:

我有两个要合并的数据框列表,我尝试了以下方法:

A <- data.frame(ID = c(1,2,3),
                var1 = c(3,4,5),
                var2 = c(6,3,2))
B <- data.frame(ID = c(1,2,3),
                var1 = c(4,4,5),
                var2 = c(6,7,3))
C <- data.frame(ID = c(1,2,3),
                var1 = c(1,4,8),
                var2 = c(9,2,3))

list1 <- list(A = A, B = B, C = C)
list2 <- list(A = A, B = B)

combined <- map2(list1, list2, full_join, by = 'ID')

这会返回两个列表长度不同的错误。我想到的唯一另一种方法是在第二个列表中添加一个空白数据框,使它们的长度相同。

是否可以合并这两个列表,以便我得到一个列表,其中 A1 与 A2 连接,B1 与 B2 连接,C1 保持原样?

编辑:突出显示我没有命名列表的元素,我现在已经命名了

【问题讨论】:

  • 如果list2list(A, C) 会怎样?
  • 它仍然返回相同的错误 Error: Mapped vectors must have consistent lengths: * .x` has length 3 * .y has length 2`
  • 不,您的列表必须命名(即list(A = A, B = B) 等...)才能将 A 与 A 匹配,依此类推。如果他们是那样的话,你什么都做不了......
  • 您可以命名您的列表元素并匹配名称(在这种情况下,您不需要在 list2 中提供 C)或继续使用位置,但您需要在列表中放置占位符。
  • 那么你的答案就在下面:)

标签: r tidyverse


【解决方案1】:

如果我们有命名列表,那么我们可以:

list1 <- list(A = A, B = B, C = C)
list2 <- list(A = A, B = B)

x12 <- intersect(names(list1), names(list2))
x1 <- setdiff(names(list1), names(list2))
x2 <- setdiff(names(list2), names(list1))

combined <- c(
  map2(list1[ x12 ], list2[ x12 ], full_join, by = 'ID'),
  list1[ x1 ],
  list2[ x2 ])

【讨论】:

    【解决方案2】:

    如果您想继续使用位置,您还可以传递占位符并在组合逻辑中处理它们。类似的东西:

    skip <- tibble(ID = integer(0))
    
    list1 <- list(A, B, C)
    list2 <- list(A, B, skip)
    list3 <- list(A, skip, C)
    
    combined  <- map2(list1, list2, full_join, by = 'ID')
    combined2 <- map2(list1, list3, full_join, by = 'ID')
    

    注意如果没有占位符,list2list3 看起来会完全一样!

    更笼统地说:

    
    list1 <- list(A, B, C)
    list2 <- list(A, B, NULL)
    list3 <- list(A, NULL, C)
    
    combine <- function(list1, list2) {
       purrr::map2(list1, list2, function(df1, df2) {
          if (is.null(df1)) return(df2)
          if (is.null(df2)) return(df1)
          full_join(df1, df2, by = 'ID')
       })
    }
    
    combined  <- combine(list1, list2)
    combined2 <- combine(list1, list3)
    
    

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2020-01-20
      • 2020-02-20
      相关资源
      最近更新 更多