【问题标题】:from two lists to one by binding elements通过绑定元素从两个列表到一个列表
【发布时间】:2019-12-24 20:04:23
【问题描述】:

我有两个列表,每个列表有两个元素,

l1 <- list(data.table(id=1:5, group=1), data.table(id=1:5, group=1))
l2 <- list(data.table(id=1:5, group=2), data.table(id=1:5, group=2))

我想rbind(.) 两个元素,从而生成一个包含两个元素的新列表。

> l
[[1]]
    id group
 1:  1     1
 2:  2     1
 3:  3     1
 4:  4     1
 5:  5     1
 6:  1     2
 7:  2     2
 8:  3     2
 9:  4     2
10:  5     2

[[2]]
    id group
 1:  1     1
 2:  2     1
 3:  3     1
 4:  4     1
 5:  5     1
 6:  1     2
 7:  2     2
 8:  3     2
 9:  4     2
10:  5     2

但是,我只找到将rbind(.) 应用于跨元素绑定的示例。我怀疑解决方案位于 lapply(.) 的某个位置,但 lapply(c(l1,l2),rbind) 似乎绑定了列表,生成了一个包含四个元素的列表。

【问题讨论】:

    标签: r list lapply rbind


    【解决方案1】:

    您可以使用mapplyMapmapply(代表多元应用)将提供的函数应用于参数的第一个元素,然后是第二个元素,然后是第三个元素,依此类推。 Map 实际上是 mapply 的包装器,它不会尝试简化结果(尝试在有和没有 SIMPLIFY=T 的情况下运行 mapply)。简而言之,参数会根据需要循环使用。

    mapply(x=l1, y=l2, function(x,y) rbind(x,y), SIMPLIFY = F)
    #[[1]]
    #    id group
    # 1:  1     1
    # 2:  2     1
    # 3:  3     1
    # 4:  4     1
    # 5:  5     1
    # 6:  1     2
    # 7:  2     2
    # 8:  3     2
    # 9:  4     2
    #10:  5     2
    #
    #[[2]]
    #    id group
    # 1:  1     1
    # 2:  2     1
    # 3:  3     1
    # 4:  4     1
    # 5:  5     1
    # 6:  1     2
    # 7:  2     2
    # 8:  3     2
    # 9:  4     2
    #10:  5     2
    

    正如@Parfait 指出的那样,您可以这样做Map

    Map(rbind, l1, l2)
    #[[1]]
    #    id group
    # 1:  1     1
    # 2:  2     1
    # 3:  3     1
    # 4:  4     1
    # 5:  5     1
    # 6:  1     2
    # 7:  2     2
    # 8:  3     2
    # 9:  4     2
    #10:  5     2
    #
    #[[2]]
    #    id group
    # 1:  1     1
    # 2:  2     1
    # 3:  3     1
    # 4:  4     1
    # 5:  5     1
    # 6:  1     2
    # 7:  2     2
    # 8:  3     2
    # 9:  4     2
    #10:  5     2
    

    【讨论】:

    • mapplySIMPLIFY=FALSE 就是Map
    • 顺便说一句 - 我们应该为 OP 和未来的读者快速描述 mapply(避免仅代码的答案)。类似于“两个或多个等长列表之间的元素循环”。
    【解决方案2】:

    使用tidyverse

    library(tidyverse0
    map2(l1, l2, bind_rows)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 2022-11-19
      • 2022-10-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      相关资源
      最近更新 更多