将列表值存储在data.frame中,行数不相等

时间:2018-07-21 19:20:18

标签: r list loops dataframe

我试图通过从列表中提取值来创建数据框。我有一个包含不等值的157列表,如这张图片

所示

而我想要的是在一个数据帧中保留所有列表值。我尝试通过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之后的结果是我想要的,如图所示:

All values of first two lists

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

1 个答案:

答案 0 :(得分:1)

您可以将do.callrbind.fill一起运行,将rbind.fill应用于list的各个条目,并将结果组合成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).