【问题标题】:How to convert a list of vectors of unequal length to a data frame如何将长度不等的向量列表转换为数据框
【发布时间】:2020-02-18 19:30:24
【问题描述】:

我需要将以下列表转换为数据框:

list(c(13, 5, 9, 16, 1, 7, 3, 20), c(0, 1, 2, 7, 8, 14, 20), c(2, 4, 7, 9, 12, 14, 16), 0:9, c(18, 19, 20, 21, 22, 23, 6, 7, 8, 9), c(0, 1, 7, 13, 19, 6, 12, 18, 2, 8), 23:22, c(18, 13, 8), c(18, 13, 8, 3, 10, 17, 12, 6, 0, 1), c(18, 14), c(18, 19, 20, 21, 13, 7, 8, 14, 2, 1), c(13, 15, 16, 9, 8, 7, 14, 20, 19, 18))

列表结构如下:

List of 1
 $ :List of 12
  ..$ : int [1:8] 13 5 9 16 1 7 3 20
  ..$ : int [1:7] 0 1 2 7 8 14 20
  ..$ : int [1:7] 2 4 7 9 12 14 16
  ..$ : int [1:10] 0 1 2 3 4 5 6 7 8 9
  ..$ : int [1:10] 18 19 20 21 22 23 6 7 8 9
  ..$ : int [1:10] 0 1 7 13 19 6 12 18 2 8
  ..$ : int [1:2] 23 22
  ..$ : int [1:3] 18 13 8
  ..$ : int [1:10] 18 13 8 3 10 17 12 6 0 1
  ..$ : int [1:2] 18 14
  ..$ : int [1:10] 18 19 20 21 13 7 8 14 2 1
  ..$ : int [1:10] 13 15 16 9 8 7 14 20 19 18

因为每个向量都可以包含 12 个整数,所以我想将此列表转换为如下所示的数据框:

    P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11 P12
D01 13  5   9   16  1   7   3   20  NA  NA  NA  NA
D02 0   1   2   7   8   14  20  NA  NA  NA  NA  NA
D03 2   4   7   9   12  14  16  NA  NA  NA  NA  NA

... and so on

非常感谢任何修复提示。

【问题讨论】:

  • data.table::rbindlist(lapply(d, function(x) setNames(data.frame(t(x)), paste0("P", seq_along(x)))), fill = TRUE)

标签: r list dataframe vector


【解决方案1】:

将列表 L 的每个组件转换为ts 系列,将它们绑定在一起,删除它分配的杂乱名称并转置。这将给出一个矩阵,其中每个组件有一行,并且与最长的组件一样多的列。

t(unname(do.call("cbind", lapply(L, ts))))

【讨论】:

    【解决方案2】:

    您可以通过修改列表中原始向量的长度来做到这一点。 让我们呼叫列表a

    a <- list(
        c(13, 5, 9, 16, 1, 7, 3, 20),
        c(0, 1, 2, 7, 8, 14, 20),
        c(2, 4, 7, 9, 12, 14, 16),
        0:9,
        c(18, 19, 20, 21, 22, 23, 6, 7, 8, 9),
        c(0, 1, 7, 13, 19, 6, 12, 18, 2, 8),
        23:22,
        c(18, 13, 8),
        c(18, 13, 8, 3, 10, 17, 12, 6, 0, 1),
        c(18, 14),
        c(18, 19, 20, 21, 13, 7, 8, 14, 2, 1),
        c(13, 15, 16, 9, 8, 7, 14, 20, 19, 18)
      )
    

    然后计算最大长度

    n <- max(sapply(a, length))
    

    并修改列表中每个元素的长度

    b <- lapply(a, function(el) {length(el) <- n ; el})
    res <- do.call("rbind", b)
    

    最后,换个名字

    dimnames(res) <- list(sprintf("D%02i", 1:nrow(res)), 
                         sprintf("P%02i", 1:ncol(res)))
    res
    # P01 P02 P03 P04 P05 P06 P07 P08 P09 P10
    # D01  13   5   9  16   1   7   3  20  NA  NA
    # D02   0   1   2   7   8  14  20  NA  NA  NA
    # D03   2   4   7   9  12  14  16  NA  NA  NA
    # D04   0   1   2   3   4   5   6   7   8   9
    # D05  18  19  20  21  22  23   6   7   8   9
    # D06   0   1   7  13  19   6  12  18   2   8
    # D07  23  22  NA  NA  NA  NA  NA  NA  NA  NA
    # D08  18  13   8  NA  NA  NA  NA  NA  NA  NA
    # D09  18  13   8   3  10  17  12   6   0   1
    # D10  18  14  NA  NA  NA  NA  NA  NA  NA  NA
    # D11  18  19  20  21  13   7   8  14   2   1
    # D12  13  15  16   9   8   7  14  20  19  18
    

    【讨论】:

    • 谢谢你在我使用@MrFlick 的代码修改索引后工作。但是,无论列表中是否有数据,我总是需要特定数量的列。你知道我如何通过更多的带有 NA 的列(例如,另外两个)来扩展矩阵吗?
    • 通过更改n? n &lt;- max(sapply(a, length)) + 2
    【解决方案3】:

    假设您的列表名为x,您可以使用

    sapply(1:12, function(i) sapply(x, `[`, i))
    

    获取你想要的数据。在这里,我们迭代您要从每个向量中提取的不同索引。当您要求一个不存在的职位时,在 R 中就会发生这种情况,您会得到NA。您只需要使用您想要的任何值添加行/列名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2020-07-03
      • 2017-09-25
      相关资源
      最近更新 更多