R 按ID列向列表添加维度

R 按ID列向列表添加维度,r,R,作为后续问题,我现在正在寻找一种有效的方法来逆转前面描述的过程。总之,我需要根据以下内容重新构造一个平面列表: > 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 $ timestam

作为后续问题,我现在正在寻找一种有效的方法来逆转前面描述的过程。总之,我需要根据以下内容重新构造一个平面列表:

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

myList一个选项是
transpose
from
purr

library(tidyverse)
res <- myList %>%
             transpose %>%
             map(~.[-1])
names(res) <- myList[[1]]
库(tidyverse)
res%
转置%>%
映射(~.[1])

名称(res)一个基本的R选项是使用嵌套的
lappy
setNames
将ID添加为外部级别列表名称

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

在您预期的输出中,当只有8个元素时,30个元素的列表似乎很奇怪。这项工作非常有效!谢谢:)很好,谢谢!我将此答案标记为解决方案,因为它不依赖于包
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