我试图通过从列表中提取值来创建数据框。我有一个包含不等值的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
之后的结果是我想要的,如图所示:
如何创建一个循环以创建所需的数据帧(如上图所示,我需要存储157个列表值或157行)?
答案 0 :(得分:1)
您可以将do.call
与rbind.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).