按ID列向列表添加维度

时间:2017-05-07 13:00:35

标签: r

作为Flatten list and push list key to vector on second level 的后续问题,我现在正在寻找一种有效的方法来扭转之前描述的过程。总之,我需要重新构建一个平面列表:

> 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 - 循环来完成此任务,但结果却非常低效。

可重复的代码:

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))

1 个答案:

答案 0 :(得分: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