我有以下列表结构:
[[1]]
[[1]][[1]]
a b c d
1 2 3 5
[[1]][[2]]
a b c d
2 5 3 5
[[2]]
[[2]][[1]]
a b c d
8 2 3 5
[[2]][[2]]
a b c d
7 5 3 1
str(fit)
List of 2
$ :List of 2
..$ : Named num [1:20] 1 2 3 5 ...
.. ..- attr(*, "names")= chr [1:20] "a" "b" "c" "d" ...
..$ : Named num [1:20] 2 5 3 5 ...
.. ..- attr(*, "names")= chr [1:20] "a" "b" "c" "d" ...
内容是列表中的每个列表都是数字结构。
我想在数据框中更改它,如下所示:
NA NA a b c d
1 1 1 2 3 5
1 2 2 5 3 5
2 1 8 2 3 5
2 2 7 5 3 1
(NA
但是,如果每个数据框都必须有名称,则可以用v1
v2
替换。)
我想知道这是否可能。
答案 0 :(得分:7)
这有点扩展到使用rbindlist
包中的data.table
函数时评论中提供的内容(您需要CRAN上的最新版本)
library(data.table) # v 1.9.6+
rbindlist(
lapply(fit, function(x) {
temp <- do.call(rbind, x)
cbind.data.frame(V2 = 1:nrow(temp), temp)
}
), idcol = "V1")
# V1 V2 a b c d
# 1: 1 1 1 2 3 5
# 2: 1 2 2 5 3 5
# 3: 2 1 8 2 3 5
# 4: 2 2 7 5 3 1
如果您总是有两个元素在每个列表中都有一行,则可以避免创建temp
而只是cbind.data.frame(V2 = 1:2, do.call(rbind, x))
而不是
数据强>
fit <- list(list(c(a = 1,b = 2,c = 3,d = 5),
c(a = 2,b = 5,c = 3,d = 5)),
list(c(a = 8,b = 2,c = 3,d = 5),
c(a = 7,b = 5,c = 3,d = 1)))
答案 1 :(得分:1)
或者在基础R中,你可以这样做:
do.call(rbind,
lapply(seq(length(fit)),
function(x){
cbind(v1=rep(x, length(fit[[x]])),
t(sapply(seq(length(fit[[x]])),
function(y, x){
c(v2=y, fit[[x]][[y]])
}, x=x)))
}))
# v1 v2 a b c d
#[1,] 1 1 1 2 3 5
#[2,] 1 2 2 5 3 5
#[3,] 2 1 8 2 3 5
#[4,] 2 2 7 5 3 1
我不打赌效率虽然......