展平列表并将列表键推送到第二级向量

Flatten list and push list key to vector on second level

我想这很简单,但我似乎无法弄明白。 我需要展平二级结构并将列表 name/key 推送到与其他向量处于同一级别的向量。 myList的当前结构是

$ 13454:List of 30
  ..$ 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 30
  ..$ 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               : chr  '13455' '13455'
 $ subjectId        : num 187 188
 $ procedureId:     : num  3 3

等等

我尝试通过以下方式实现此目的:

  myList2 <- sapply(names(myList), function(y){
    y <- unlist(c('ID' = y, myList[[y]]), use.names = TRUE)
  })

但我最终得到了我需要的完整转置结果。我可以 t(myList2) 但我想了解如何正确执行此操作。谢谢!

编辑:可重现数据:

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

编辑: 要获得您上面在基础 R 中指定的列表格式,请使用 rbind 构建数据框,然后使用 [= 取消列出必要的元素12=].

根据上面的列表,您可以使用 do.call 在基数 R 中调用 rbind

example<-data.frame(ID = as.character(names(myList)), do.call("rbind", myList), row.names = NULL)
exAsList <-lapply(example, function(x) x <- unlist(x, use.names = FALSE))
exAsList

myList 可以使用 data.table 包中的 lapply()rbindlist() 变成 data.frame:

result <- data.table::rbindlist(lapply(myList, as.data.frame), idcol = "ID")
result[["ID"]] <- names(myList)
result
#      ID subjectId procedureId procedureSampleId                timestamp n001 n002 gender age
#1: 13454       187           3                 3 2017-04-21T17:15:10.911Z -999 -999      1  18
#2: 13455       188           3                 3 2017-04-21T17:15:10.913Z -999 -999   -999  28

编辑:这个可以更精简:

library(data.table)
rbindlist(myList, idcol = "ID")[, ID := names(myList)][]