【问题标题】:Flatten, append, and relist a list in R在 R 中展平、追加和重新列出列表
【发布时间】:2021-06-07 21:43:26
【问题描述】:

我在 R 中有两个列表列表,我想加入一个列表列表并保留原始结构。以以下为例:

library(tidyverse)
library(dplyr)
library(purrr)

a <-  data.frame(c("MA", "V", "UDR"), stringsAsFactors=FALSE)
b <-  data.frame(c("MMM", "AAPL"), stringsAsFactors=FALSE)
c <-  data.frame(c("MO", "ABT", "XYZ", "Q"), stringsAsFactors=FALSE)
d <-  data.frame(c("AA", "NEM", "LUV"), stringsAsFactors=FALSE)

lst1 <- list(list(a), list(b))
lst2 <- list(list(c), list(d))

我会撒谎创建一个 lst3,它附加/连接子列表“a”和“c”以及“b”和“d”中包含的字符。

我想要的结果是:

lst3 <- list(list(data.frame(c("MA", "V", "UDR", "MO", "ABT", "XYZ", "Q"))), list(data.frame(c("MMM", "AAPL", "AA", "NEM", "LUV"))))

我认为下面的代码很接近,但我不太明白。

lst3 <- map(1:2, function(x) {
  append(flatten(lst1[[x]]), flatten(lst2[[x]]))
})

【问题讨论】:

  • lst1 和 lst2 不仅仅是数据帧列表,而不是每个包含单个数据帧的列表列表,是否有某种原因?另请注意,从 R 4.0 开始,stringsAsFactors=FALSE 是默认值,因此无需指定。
  • 是的,这可能是可能的。在我的真实代码中,它只是 map 函数的结果。所以我试图尽可能接近真实情况进行复制。谢谢!

标签: r append flatten


【解决方案1】:

您也可以使用来自purrrmap2

map2(lst1, lst2, ~unname(c(unlist(.x), unlist(.y))))
# [[1]]
# [1] "MA"  "V"   "UDR" "MO"  "ABT" "XYZ" "Q"  
# 
# [[2]]
# [1] "MMM"  "AAPL" "AA"   "NEM"  "LUV" 

【讨论】:

    【解决方案2】:

    我们可以使用Map 来循环对应的list 元素unlist 并创建一个嵌套的data.frame

    Map(function(x, y) list(data.frame(col1 = c(unlist(x, 
              use.names = FALSE), unlist(y, use.names = FALSE)))), 
        lst1, lst2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2015-01-10
      • 2012-04-11
      • 2021-06-10
      相关资源
      最近更新 更多