首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定包含嵌套data.frames列的data.frames

绑定包含嵌套data.frames列的data.frames
EN

Stack Overflow用户
提问于 2019-12-13 10:20:58
回答 2查看 525关注 0票数 0

在使用jsonlite导入多个.json文件之后,我一直在寻找绑定结果data.frames的方法,它包含一个或多个列,这些列本身就是嵌套的data.frames。我偶然发现了下面这篇文章https://r.789695.n4.nabble.com/data-frame-with-nested-data-frame-td3162660.html,它帮助突出了这个问题。

代码语言:javascript
复制
## Create nested data.frames
dat1 <- data.frame(x = 1)
dat1$y <- data.frame(y1 = "a", y2 = "A", stringsAsFactors = FALSE)

dat2 <- data.frame(x = 2)
dat2$y <- data.frame(y1 = "b", stringsAsFactors = FALSE)

这些都不起作用。

代码语言:javascript
复制
rbind(dat1, dat2)
dplyr::bind_rows(dat1, dat2)
data.table::rbindlist(list(dat1, dat2))

我发现了一些解决方法,我将在下面发布它们,以防它们对其他人有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-13 16:31:33

这也可以在没有额外的包的情况下完成。数据帧需要在list内被部分地unlist,然后使用Reducemerged。

代码语言:javascript
复制
Reduce(function(...) merge(..., all=TRUE), Map(unlist, list(dat1, dat2), recursive=FALSE))
#   x y.y1 y.y2
# 1 1    a    A
# 2 2    b <NA>

这也适用于两个以上的嵌套数据帧。

代码语言:javascript
复制
dat3 <- data.frame(x=2, y=data.frame(y1="c", y2="C", z="CC", stringsAsFactors=FALSE))

Reduce(function(...) merge(..., all=TRUE), Map(unlist, list(dat1, dat2, dat3), recursive=FALSE))
#   x y.y1 y.y2  y.z
# 1 1    a    A <NA>
# 2 2    b <NA> <NA>
# 3 2    c    C   CC

数据

代码语言:javascript
复制
dat1 <- structure(list(x = 1, y = structure(list(y1 = "a", y2 = "A"), class = "data.frame", 
                                    row.names = c(NA, -1L))), row.names = c(NA, -1L), 
          class = "data.frame")

dat2 <- structure(list(x = 2, y = structure(list(y1 = "b"), class = "data.frame", 
                                    row.names = c(NA, -1L))), row.names = c(NA, -1L), 
          class = "data.frame")
票数 0
EN

Stack Overflow用户

发布于 2019-12-13 10:20:58

首先展平数据(对于基本rbind,data.frames需要具有相同的列名)

代码语言:javascript
复制
dplyr::bind_rows(
  jsonlite::flatten(dat1),
  jsonlite::flatten(dat2)
)

在绑定之前将data.frames放到一个列表中(现在所有方法都有效)

代码语言:javascript
复制
dat1$y <- list(dat1$y)
dat2$y <- list(dat2$y)

rbind(dat1, dat2)
dplyr::bind_rows(dat1, dat2)
data.table::rbindlist(list(dat1, dat2))

使用tidyverse嵌套data.frames

代码语言:javascript
复制
tib1 <- tidyr::nest(dat1, y = c(y))
tib2 <- tidyr::nest(dat2, y = c(y))
tib3 <- dplyr::bind_rows(tib1, tib2)
tidyr::unnest(tib3, c(y))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59315288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档