从不等向量长度列表中创建 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.table
,setDT
更紧凑
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
我想从不相等的向量列表中创建一个 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.table
,setDT
更紧凑
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