2017-05-07 39 views
2

作为Flatten list and push list key to vector on second level 的后续问题,我现在正在寻找一种有效的方法来扭转前面描述的过程。总之,我需要从这个重组的平面列表:通过ID列添加维度到列表

> str(myList) 
List of 9 
$ ID    : num [1:2] 13454 13455 
$ subjectId  : num [1:2] 187 188 
$ procedureId  : num [1:2] 3 3 
$ procedureSampleId: num [1:2] 3 3 
$ timestamp  : chr [1:2] "2017-04-21T17:15:10.911Z" "2017-04-21T17:15:10.913Z" 
$ n001    : num [1:2] -999 -999 
$ n002    : num [1:2] -999 -999 
$ gender   : num [1:2] 1 -999 
$ age    : num [1:2] 18 28 

这样:

$ 13454:List of 8 
    ..$ subjectId  : num 187 
    ..$ procedureId  : num 3 
    ..$ procedureSampleId: num 3 
    ..$ timestamp  : chr "2017-04-21T17:15:10.911Z" 
    ..$ n001    : num -999 
    ..$ n002    : num -999 
    ..$ gender   : num 1 
    ..$ age    : num 18 

$ 13455:List of 8 
    ..$ subjectId  : num 188 
    ..$ procedureId  : num 3 
    ..$ procedureSampleId: num 3 
    ..$ timestamp  : chr "2017-04-21T17:15:10.913Z" 
    ..$ n001    : num -999 
    ..$ n002    : num -999  
    ..$ gender   : num -999 
    ..$ age    : num 28 

而每个ID列应该是它自己的列表。到目前为止,我一直在使用for -loops来完成这个任务,但事实证明这是非常低效的。

重现的代码:

myList <- list('ID' = c(13454,13455), 'subjectId' = c(187,188), 'procedureId' = c(3,3), 'procedureSampleId' = c(3,3), 'timestamp' = c("2017-04-21T17:15:10.911Z", "2017-04-21T17:15:10.913Z"), 'n001' = c(-999,-999), 'n002' = c(-999,-999), 'gender' = c(1,-999), 'age' = c(18,28)) 
+0

在你预期的输出,当只有8个元素的30名单似乎很奇怪 – akrun

回答

1

甲基础R替代方案将是使用嵌套lapplysetNames添加ID作为外级列表的名称。

myNestList <- setNames(lapply(1:2, 
         function(i) lapply(myList[-1], "[", i)), myList[[1]]) 

导致

str(myList) 
List of 2 
$ :List of 8 
    ..$ subjectId  : num 187 
    ..$ procedureId  : num 3 
    ..$ procedureSampleId: num 3 
    ..$ timestamp  : chr "2017-04-21T17:15:10.911Z" 
    ..$ n001    : num -999 
    ..$ n002    : num -999 
    ..$ gender   : num 1 
    ..$ age    : num 18 
$ :List of 8 
    ..$ subjectId  : num 188 
    ..$ procedureId  : num 3 
    ..$ procedureSampleId: num 3 
    ..$ timestamp  : chr "2017-04-21T17:15:10.913Z" 
    ..$ n001    : num -999 
    ..$ n002    : num -999 
    ..$ gender   : num -999 
    ..$ age    : num 28 
+0

工作正常,谢谢!我将这个答案标记为解决方案,因为它不依赖于包 –

2

一种选择是transposepurrr

library(tidyverse) 
res <- myList %>% 
      transpose %>% 
      map(~.[-1]) 
names(res) <- myList[[1]] 
+1

这工作,似乎是非常有效的!谢谢:) –