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

Posted

技术标签:

【中文标题】as.data.frame 将嵌套列表展平为单行,而不是为每条记录创建行 [重复]【英文标题】:as.data.frame flattens nested list into single row instead of creating row for each record [duplicate] 【发布时间】:2014-11-15 18:19:40 【问题描述】:

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

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"

我想把它变成一个数据框,其中包含“名称”和“状态”列以及两行,每条记录一行。但是当我尝试使用 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

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

【问题讨论】:

【参考方案1】:
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

您甚至可以让rbindReduce“合作”:

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

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

【讨论】:

这当然有效。 do.call 在做什么?为什么 rbind(mylist) 不起作用? mylist 不是向量或矩阵,所以rbind.default 不起作用,也没有rbind.list 生成的 row.names 很奇怪(上面的 21 个),但我认为这是无害的,而且,我们总是可以 NULLify 他们...【参考方案2】:

或者试试data.tables rbindlist函数(对大数据集非常有效)

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

【讨论】:

以上是关于as.data.frame 将嵌套列表展平为单行,而不是为每条记录创建行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套命名元组的列表展平为字典列表

将嵌套的 dict 列表展平为 Pandas Dataframe

Erlang Lists:展平嵌套列表

如何将元组列表展平为pythonic列表[重复]

如何展平多个嵌套的 json 并转换为数据框?

将带有嵌套列表的列表转换为带有嵌套数据框的单行小标题