【问题标题】:Creating data.table from a list of unequal vector lengths从不等向量长度的列表中创建 data.table
【发布时间】:2021-12-04 01:10:11
【问题描述】:

我希望从不相等的向量列表中创建一个 data.table,但不是重复“较短”向量的值,而是希望它用 NA 填充。我有一种可能的解决方案,但它会重复值并且不会根据需要保留 NA。

例子:

library(data.table)
my_list <- list(A = 1:4, B = letters[1:5])  
as.data.table(do.call(cbind, my_list))

as.data.table(do.call(cbind, my_list))
   A B
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 1 e

但我希望它看起来像:

as.data.table(do.call(cbind, my_list))
   A B
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: NA e

谢谢!

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们需要通过在list 元素的末尾附加NA 来使lengths 相同,该元素的length 小于max 长度

    mx <- max(lengths(my_list))
    as.data.table(do.call(cbind, lapply(my_list, `length<-`, mx)))
    

    -输出

          A B
    1:    1 a
    2:    2 b
    3:    3 c
    4:    4 d
    5: <NA> e
    

    setDTcbind/as.data.table 更紧凑

    setDT(lapply(my_list, `length<-`, mx))[]
        A B
    1:  1 a
    2:  2 b
    3:  3 c
    4:  4 d
    5: NA e
    

    【讨论】:

      【解决方案2】:

      您可以使用stringi::stri_list2matrix 使所有列表长度相等。

      my_list |>
        stringi::stri_list2matrix() |>
        data.table::as.data.table() |>
        type.convert(as.is = TRUE) |>
        setNames(names(my_list))
      
      #    A B
      #1:  1 a
      #2:  2 b
      #3:  3 c
      #4:  4 d
      #5: NA e
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 2012-04-24
        • 2019-08-16
        • 2013-04-15
        • 2018-03-07
        • 1970-01-01
        相关资源
        最近更新 更多