【问题标题】:concatenate vectors from a lists of lists连接列表列表中的向量
【发布时间】:2017-04-15 15:17:26
【问题描述】:

我想对某个问题有一个通用的解决方案。 我有一个嵌套列表;这个列表的每个元素都是一个带有命名元素的列表。例如:

mylist <- list(
  list(x1 = 1:10, x2 = letters[1:5]),
  list(x1 = 11:14, x2 = letters[6:15])
)

这里mylist[[1]]mylist[[2]] 都有向量x1x2

我想连接所有的x1向量和x2向量,比如得到:

c(mylist[[1]]$x1, mylist[[2]]$x1)
c(mylist[[1]]$x2, mylist[[2]]$x2)

但对于mylist 可能具有n 元素的一般情况。

如果我事先知道mylist 只有两个元素,那么我可以使用

do.call(function(a,b) c(a$x1, b$x1), mylist)
do.call(function(a,b) c(a$x2, b$x2), mylist)

但我不知道如何将其概括为 n 元素。

【问题讨论】:

  • ?.mapply -- .mapply(c, mylist, NULL) 或者,更方便的界面do.call(Map, c(c, mylist))

标签: r


【解决方案1】:
vecs <- unlist(mylist, recursive = F)
lapply(unique(names(vecs)), function(name) do.call(c, vecs[name == names(vecs)]))

【讨论】:

    【解决方案2】:

    如果您想使用tidyverse 执行此操作,则:

    library(tidyverse)
    

    根据@jbaums 的评论进行编辑,并注意到flatten 返回的是一个列表而不是一个向量:

    purrr::transpose(mylist) %>% purrr::map(unlist)
    

    【讨论】:

    • 这将需要一个额外的%&gt;% lapply(unlist)(或者可能是一个 tidyverse 替代方案)。但是你也可以只做purrr::transpose(mylist) %&gt;% lapply(unlist)
    • 关于非列表的好点。 purrr::flatten 将输出保留为列表。类型变体 flatten_chrflatten_dbl 在不增加检查 x1 和 x2 类型的复杂性的情况下将无法工作(并且关于 x1 和 x2 类型的稳定性问题尚不清楚)。
    猜你喜欢
    • 2022-07-05
    • 2018-12-08
    • 1970-01-01
    • 2020-01-20
    • 2016-02-20
    • 2014-08-20
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多