将列表行转置为数据帧

时间:2017-08-18 10:28:10

标签: r list dataframe lapply transpose

假设这是我的列表结构

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

有关应如何做的任何建议。

感谢。

2 个答案:

答案 0 :(得分:4)

两种方法:

1)使用 - 包

使用:

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

答案 1 :(得分:2)

这是使用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