2015-10-16 76 views
-2

我有以下列表结构:变化列表数据帧进行统计分析

[[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但是,可以通过v1v2如果每个数据帧都必须有一个名字被替换)

我不知道如果这是可能的。

+1

请使用'dput'来显示数据 – akrun

+0

这是通常使用do.call(rbind,YourList)完成,但没有看到您的数据... – user1945827

+1

@ user1945827将不能与清单列表一起使用。它可能是'do.call(rbind,do.call(c,fit))' – akrun

回答

7

这有点膨胀到什么评论,同时利用从data.tablerbindlist功能是提供(你需要在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

还是在基础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 

我不会,虽然效率赌...