将列表中的列表更改为数据框以进行统计分析

时间:2015-10-16 07:15:51

标签: r list dataframe

我有以下列表结构:

[[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替换。)

我想知道这是否可能。

2 个答案:

答案 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

我不打赌效率虽然......