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

时间:2018-08-11 02:17:43

标签: r list dataframe vector elements

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

$`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

希望您能为我提供帮助,我一直在寻找类似的问题,但到目前为止,只能找到向量中元素的数量和顺序一致的情况...

2 个答案:

答案 0 :(得分:1)

我们还可以在purrr::full_join内使用purrr::reduce

# 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

答案 1 :(得分:0)

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

  mylist <-list(
    一个= c(SW = 0.49,GHS = 0.46,GS = 0.03),
    两个= c(GHS = 0.07,GW = 0.03,LLW = 0.03,GS = 0.00),
    六个= 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不适用不适用不适用
2:不适用0.07 0.00 0.03 0.03不适用
3:0.42 0.41不适用不适用0.09