展平列表并将列表键推送到第二级向量
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)][]
我想这很简单,但我似乎无法弄明白。
我需要展平二级结构并将列表 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)][]