首页 > 解决方案 > 将列表值存储在具有不相等行的 data.frame 中

问题描述

我正在尝试通过从列表中提取值来创建数据框。我有一个 157 列表,其中包含不相等的值,如图所示

我想要的是 rbind 一个数据框中的所有列表值。我试图通过 for 循环来做到这一点,但它只存储了第一个列表值。
我能做的是:

   porturn1=data.table::rbindlist(lapply(porturn[1], as.data.frame), idcol = "id")
   porturn2=data.table::rbindlist(lapply(porturn[2], as.data.frame), idcol = "id")
   porturn3=data.table::rbindlist(lapply(porturn[3], as.data.frame), idcol = "id")
   porturn4=data.table::rbindlist(lapply(porturn[4], as.data.frame), idcol = "id")
   porturn5=data.table::rbindlist(lapply(porturn[5], as.data.frame), idcol = "id")

然后将rbind.fill命令应用于所有这些数据,但这似乎很麻烦且不切实际。虽然之后的结果rbind.fill是我想要的,如图所示:

前两个列表的所有值

如何创建一个循环来创建所需的数据框(如上图所示,我需要存储 157 个列表值或 157 行)?

标签: rlistloopsdataframe

解决方案


您可以使用 运行do.callrbind.fill它适用rbind.fill于 a 的各个条目list并将结果组合在一起,在本例中为 a data.frame

library(plyr)

## make test data
set.seed(0)
porturn <- sapply(sample(1:20, 10), function(x) 1:x)
str(porturn)
#> List of 10
#>  $ : int [1:18] 1 2 3 4 5 6 7 8 9 10 ...
#>  $ : int [1:6] 1 2 3 4 5 6
#>  $ : int [1:7] 1 2 3 4 5 6 7
#>  $ : int [1:10] 1 2 3 4 5 6 7 8 9 10
#>  $ : int [1:15] 1 2 3 4 5 6 7 8 9 10 ...
#>  $ : int [1:4] 1 2 3 4
#>  $ : int [1:13] 1 2 3 4 5 6 7 8 9 10 ...
#>  $ : int [1:14] 1 2 3 4 5 6 7 8 9 10 ...
#>  $ : int [1:8] 1 2 3 4 5 6 7 8
#>  $ : int [1:20] 1 2 3 4 5 6 7 8 9 10 ...

## work
porturnall = do.call(rbind.fill,lapply(porturn, function(x) as.data.frame(t(x))))
print(porturnall)
#>    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
#> 1   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  NA  NA
#> 2   1  2  3  4  5  6 NA NA NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#> 3   1  2  3  4  5  6  7 NA NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#> 4   1  2  3  4  5  6  7  8  9  10  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#> 5   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  NA  NA  NA  NA  NA
#> 6   1  2  3  4 NA NA NA NA NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#> 7   1  2  3  4  5  6  7  8  9  10  11  12  13  NA  NA  NA  NA  NA  NA  NA
#> 8   1  2  3  4  5  6  7  8  9  10  11  12  13  14  NA  NA  NA  NA  NA  NA
#> 9   1  2  3  4  5  6  7  8 NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#> 10  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20

## Created on 2018-07-21 by the reprex package (v0.2.0).

推荐阅读