【问题标题】:Merge List containing Lists with the same structure合并包含具有相同结构的列表的列表
【发布时间】:2019-12-15 01:32:33
【问题描述】:

我有一个包含多个列表的列表,这些列表都具有相同的结构:

ls <- list(
one = list(df = data.frame(var1_1 = c(1, 1, 1),
                           var1_2 = c('a', 'a', 'a')),
           ls = list(n_df_1 = data.frame(var3_1 = c('x', 'x', 'x'),
                                         var3_2 = c(4, 4, 4))),
           name = c("one", "one", "one")),
two = list(df = data.frame(var1_1 = c(1, 1, 1),
                           var1_2 = c('a', 'a', 'a')),
           ls = list(n_df_1 = data.frame(var3_1 = c('x', 'x', 'x'),
                                         var3_2 = c(4, 4, 4))),
           name = c("two", "two", "two")))

我想合并所有这些嵌套列表,如下所述:Merge Two Lists in R

如果我这样做,它完全符合我的要求:

merged <- mapply(c, ls[[1]], ls[[2]], SIMPLIFY = FALSE)

问题在于,主列表 (ls) 并不总是只有两个嵌套列表。如何让这段代码更加模块化?

我试图创建一个包含所有嵌套列表索引的向量:

sapply(seq_along(ls), function(x) paste0("ls[[", x, "]]"))

哪个输出这个:

[1] "ls[[1]]" "ls[[2]]"

我想我可以取消引用这些字符向量,以便 R 将它们视为对象。但我不知道该怎么做(如果可能的话)。我为此查看了 tidy eval,但我不知道这是否是这样做的方法。

有什么建议吗?

【问题讨论】:

  • 请不要将您的列表命名为ls。 R中有一个预定义函数ls,您可以通过重新定义它来覆盖它

标签: r mapply


【解决方案1】:

您可以使用Reduce 对列表元素的抽象数量执行此操作,即

Reduce(function(...)Map(c, ...), l1) #Map = mapply(..., simplify = FALSE)

给出,

$df
$df$var1_1
[1] 1 1 1

$df$var1_2
[1] a a a
Levels: a

$df$var1_1
[1] 1 1 1

$df$var1_2
[1] a a a
Levels: a


$ls
$ls$n_df_1
  var3_1 var3_2
1      x      4
2      x      4
3      x      4

$ls$n_df_1
  var3_1 var3_2
1      x      4
2      x      4
3      x      4


$name
[1] "one" "one" "one" "two" "two" "two"

数据:

dput(l1)
list(one = list(df = structure(list(var1_1 = c(1, 1, 1), var1_2 = structure(c(1L, 
1L, 1L), .Label = "a", class = "factor")), class = "data.frame", row.names = c(NA, 
-3L)), ls = list(n_df_1 = structure(list(var3_1 = structure(c(1L, 
1L, 1L), .Label = "x", class = "factor"), var3_2 = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
-3L))), name = c("one", "one", "one")), two = list(df = structure(list(
    var1_1 = c(1, 1, 1), var1_2 = structure(c(1L, 1L, 1L), .Label = "a", class = "factor")), class = "data.frame", row.names = c(NA, 
-3L)), ls = list(n_df_1 = structure(list(var3_1 = structure(c(1L, 
1L, 1L), .Label = "x", class = "factor"), var3_2 = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
-3L))), name = c("two", "two", "two")))

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多