从不等向量长度列表中创建 data.table

Creating data.table from a list of unequal vector lengths

我想从不相等的向量列表中创建一个 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

谢谢!

我们需要通过在 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

而不是cbind/as.data.tablesetDT更紧凑

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

您可以使用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