as.data.frame将嵌套列表展平为单行,而不是为每条记录创建行

时间:2014-09-21 19:22:12

标签: r dataframe

我有一个嵌套列表,如下所示:

mylist <- vector("list", 2)
mylist[[1]]$name <- "The Tucson IOT Meetup Group"
mylist[[1]]$state <- "AZ"
mylist[[2]]$name <- "#SFMySQL Meetup"
mylist[[2]]$state <- "CA"

mylist
[[1]]
[[1]]$name
[1] "The Tucson IOT Meetup Group"

[[1]]$state
[1] "AZ"


[[2]]
[[2]]$name
[1] "#SFMySQL Meetup"

[[2]]$state
[1] "CA"

我想把它变成一个带有“name”和“state”列的数据框和两行,每行一个。但是当我尝试使用as.data.frame来执行此操作时,我会返回一行数据,每个记录的变量都有单独的列,如下所示:

myframe <- as.data.frame(mylist)
myframe
                              name state          name.1 state.1
1 The Tucson IOT Meetup Group    AZ #SFMySQL Meetup      CA

我不确定发生了什么。什么是正确的方法?

2 个答案:

答案 0 :(得分:5)

do.call(rbind.data.frame, mylist)
##                           name state
## 2  The Tucson IOT Meetup Group    AZ
## 21             #SFMySQL Meetup    CA

do.call函数有点像(l / s)apply函数,并允许函数累积连续调用的结果。 Reduce函数有时会实现相同的结果:

 Reduce(rbind.data.frame, mylist)
##                          name state
##2  The Tucson IOT Meetup Group    AZ
##21             #SFMySQL Meetup    CA

你甚至可以rbind到#34;工作&#34;与Reduce

Reduce(rbind, mylist)
##     name                          state
##init "The Tucson IOT Meetup Group" "AZ" 
##     "#SFMySQL Meetup"             "CA" 

最初认为可能是最好的结果。 (我更喜欢提供字符值而不是因子的结果。)然而,当使用str()查看时,两种Reduce方法都会提供相当奇怪的结构。

答案 1 :(得分:4)

或尝试data.table s rbindlist函数(对大数据集非常有效)

library(data.table)
rbindlist(mylist)
#                           name state
# 1: The Tucson IOT Meetup Group    AZ
# 2:             #SFMySQL Meetup    CA