如何将不同长度的向量列表的元素放入数据框中,并将向量的元素分隔为不同的列

How to put elements of a list of vectors of different lengths into a data frame, with elements of vectors being separated as different columns

我想将列表中的元素放入数据框中。该列表具有以下形状:

$`1`
    SW        GHS         GS 
0.49075730 0.46511628 0.02564103 

...

$`95`
   GHS         SW        LLB         GS 
 0.06896552 0.03448276 0.03448276 0.00000000 

$`96`
   GHS         SW         TD 
0.40736411 0.42843691 0.09003831 

如您所见,向量的元素并不总是以相同的顺序排列,它们的数量也是可变的。 我希望将其放入这样的数据框中:

     GHS         SW         TD         GS        LLB
1 0.46511628 0.49075730         NA 0.02564103         NA
2 0.06896552 0.03448276         NA 0.00000000 0.03448276
3 0.40736411 0.42843691 0.09003831         NA         NA

我希望你能帮助我,我已经寻找过类似的问题,但到目前为止只能找到向量中元素的数量和顺序一致的情况......

下面的解决方案 (1) 将每个列表元素转换为数据框,其中 t() 用于将元素名称作为数据框中的列名,以及 (2) 将这些数据框行绑定在一起,其中data.table 的 fill 参数对不一致的向量 lengths/names.

有帮助
mylist <- list(
    one = c(SW=0.49, GHS=0.46, GS=0.03),
    two = c(GHS=0.07, GW = 0.03, LLW=0.03, GS=0.00),
    six = c(GHS=0.41, SW=0.42, TD=0.09)
)

temp <- lapply(mylist, function(x) data.frame(t(x)))
data.table::rbindlist(temp, fill=TRUE)

输出:

     SW  GHS   GS   GW  LLW   TD
1: 0.49 0.46 0.03   NA   NA   NA
2:   NA 0.07 0.00 0.03 0.03   NA
3: 0.42 0.41   NA   NA   NA 0.09

我们也可以在purrr::reduce

中使用purrr::full_join
# Reproducible sample data
set.seed(2018)
lst <- list(
    `1` = setNames(as.data.frame(matrix(runif(3), ncol = 3)), c("SW", "GHS", "GS")),
    `95` = setNames(as.data.frame(matrix(runif(4), ncol = 4)), c("GHS", "SW", "LLB", "GS")),
    `96` = setNames(as.data.frame(matrix(runif(3), ncol = 3)), c("GHS", "SW", "TD")))

# Merge
library(purrr)
reduce(lst, full_join)
#         SW       GHS         GS       LLB        TD
#1 0.3361535 0.4637233 0.06058539        NA        NA
#2 0.4743142 0.1974336 0.60675886 0.3010486        NA
#3 0.9586547 0.1300121         NA        NA 0.5468495