将列表行转置为数据框

Transpose list rows into a dataframe

假设这是我的列表结构

lst=list(structure(c("level1", "level2", "level4", "level5","18", "abc", "pqr", "lmn"),
         .Dim = c(4L, 2L)), 
     structure(c("level1", "level2", "level3", "level5", "level6", "20", "xyz", "hive", "foo", "bar"), 
        .Dim = c(5L, 2L)),
     structure(c("level1", "level3", "level4", "level5","level6", "22", "dark", "yellow","foobar", "blue"), 
        .Dim = c(5L, 2L)),
     structure(c("level1", "level2", "level3", "level5","level6","level7","24", "dvd", "dxs","glass", "while","though"), 
     .Dim = c(6L, 2L))
     )

期待O/P这样的事情

     level1 level2  level3  level4  level5  level6  level7
1)     18       abc     NA      pqr     lmn     NA      NA
2)     20       xyz     hive    NA      foo     bar     NA
3)     22       NA      dark    yellow  foobar  blue    NA
4)     24       dvd     dxs     NA      glass   while   though  

应转置所有列表的第一列,相应地,应在其行中查找相应的数据。

尝试将所有行转置为列本身给出错误

 unique(t(list_temp[[c(1,2)]][,1]))
ERROR:Error in list_temp[[c(1, 2)]][, 1] : incorrect number of dimensions

也试过

apply(list_temp,1,function(x){list_temp[[x]][,1]})

但是给了我

Error in apply(list_temp, 1, function(x) { : 
  dim(X) must have a positive length

关于如何完成的任何建议。

谢谢。

两种方法:

1) 使用 -package

有:

library(data.table)
dcast(rbindlist(lapply(lst, as.data.table), idcol = 'id'),
      id ~ V1, value.var = 'V2')[, id := NULL][]

你得到:

   level1 level2 level3 level4 level5 level6 level7
1:     18    abc     NA    pqr    lmn     NA     NA
2:     20    xyz   hive     NA    foo    bar     NA
3:     22     NA   dark yellow foobar   blue     NA
4:     24    dvd    dxs     NA  glass  while though

2) 使用基数 R

有:

reshape(transform(do.call(rbind.data.frame, lst),
                  r = rep(seq_along(lst), lengths(lst)/2)),
        idvar = 'r', timevar = 'V1', direction = 'wide')[,-1]

你得到:

   V2.level1 V2.level2 V2.level4 V2.level5 V2.level3 V2.level6 V2.level7
1         18       abc       pqr       lmn      <NA>      <NA>      <NA>
5         20       xyz      <NA>       foo      hive       bar      <NA>
10        22      <NA>    yellow    foobar      dark      blue      <NA>
15        24       dvd      <NA>     glass       dxs     while    though

这是另一个想法,使用Reduce合并数据帧,然后转置并做一些清理,即

m1 <- t(Reduce(function(...) merge(..., by = 'V1', all = TRUE), lapply(lst, as.data.frame)))
colnames(m1) <- m1[1,]
row.names(m1) <- NULL
final_d <- as.data.frame(m1[-1,], stringsAsFactors = FALSE)

这给出了,

   level1 level2 level4 level5 level3 level6 level7
1     18    abc    pqr    lmn   <NA>   <NA>   <NA>
2     20    xyz   <NA>    foo   hive    bar   <NA>
3     22   <NA> yellow foobar   dark   blue   <NA>
4     24    dvd   <NA>  glass    dxs  while though