将嵌套数据框扩展到父级

Posted

技术标签:

【中文标题】将嵌套数据框扩展到父级【英文标题】:Expand nested dataframe into parent 【发布时间】:2018-06-15 19:55:09 【问题描述】:

我有一个嵌套在从 Mongo 获取的数据框中的数据框。每个中的行数匹配,因此在查看时它看起来像一个典型的数据框。我的问题,如何以便我可以运行 dplyr 选择?请看下面的布局

'data.frame':   10 obs. of  2 variables:
 $ _id         : int  1551 1033 1061 1262 1032 1896 1080 1099 1679 1690
 $ personalInfo:'data.frame':   10 obs. of  2 variables:
  ..$ FirstName     :List of 10
  .. ..$ : chr "Jack"
  .. ..$ : chr "Yogesh"
  .. ..$ : chr "Steven"
  .. ..$ : chr "Richard"
  .. ..$ : chr "Thomas"
  .. ..$ : chr "Craig"
  .. ..$ : chr "David"
  .. ..$ : chr "Aman"
  .. ..$ : chr "Frank"
  .. ..$ : chr "Robert"
  ..$ MiddleName    :List of 10
  .. ..$ : chr "B"
  .. ..$ : NULL
  .. ..$ : chr "J"
  .. ..$ : chr "I"
  .. ..$ : chr "E"
  .. ..$ : chr "A"
  .. ..$ : chr "R"
  .. ..$ : NULL
  .. ..$ : chr "J"
  .. ..$ : chr "E"

根据建议,这是您重新创建数据的方式

id <- c(1551, 1033, 1061, 1262, 1032, 1896, 1080, 1099, 1679, 1690)
fname <- list("Jack","Yogesh","Steven","Richard","Thomas","Craig","David","Aman","Frank","Robert")
mname <- list("B",NULL,"J","I","E","A","R",NULL,"J","E")

sub <- as.data.frame(cbind(fname, mname))
master <- as.data.frame(id)
master$personalInfo <- sub

【问题讨论】:

如果您在reproducible format 中分享您的数据,会更容易提供帮助。复制/粘贴str() 的结果来测试可能的解决方案并不容易。另外,你用什么函数来得到这个结果?该函数中是否没有创建data.frame的选项?这些具有 NULL 值的列表将很难转换。 不是完全相同的副本,但这可能会有所帮助:***.com/questions/47224831/… 【参考方案1】:

我们可以循环 'personalInfo',将 listNULL 元素更改为 NA 并将其转换为具有 3 列的真实数据集

library(tidyverse)
out <- master %>% 
        pull(personalInfo) %>% 
        map_df(~ map_chr(.x, ~ replace(.x, is.null(.x), NA))) %>% 
        bind_cols(master %>%
               select(id), .)
str(out)
#'data.frame':  10 obs. of  3 variables:
# $ id   : num  1551 1033 1061 1262 1032 ...
# $ fname: chr  "Jack" "Yogesh" "Steven" "Richard" ...
# $ mname: chr  "B" NA "J" "I" ...

【讨论】:

您的回答和@Moody_Mudskipper 对我来说都很好,谢谢你们的帮助。我对穆迪进行了检查,尽管 b/c 这与我的想法类似。你的更简洁,可能是更好的代码,我只是更多地考虑了思考过程。你可以随意骂我的名字。【参考方案2】:

虽然@akrun 的回答可能更实用,也可能是整理数据的方式,但我认为这个输出更接近你的描述。

我创建了一个新环境,在其中放置了data.frame 的内容,在那里我将您有问题的列的内容取消列出到所述环境中,最后我将其全部包装回data.frame

我对@9​​87654323@ 使用了一个奇怪的技巧,因为as.data.frame 对列表列很烦。但是,使用 tibble::as_tibble 效果很好。

new_env <- new.env()
list2env(master,new_env)
list2env(new_env$personalInfo,new_env)
rm(personalInfo,envir = new_env)
res <- as.data.frame(do.call(cbind,as.list(new_env))) # or as_tibble(as.list(new_env))
rm(new_env)
res
#      fname   id mname
# 1     Jack 1551     B
# 2   Yogesh 1033  NULL
# 3   Steven 1061     J
# 4  Richard 1262     I
# 5   Thomas 1032     E
# 6    Craig 1896     A
# 7    David 1080     R
# 8     Aman 1099  NULL
# 9    Frank 1679     J
# 10  Robert 1690     E

str(res)
# 'data.frame': 10 obs. of  3 variables:
#   $ fname:List of 10
# ..$ : chr "Jack"
# ..$ : chr "Yogesh"
# ..$ : chr "Steven"
# ..$ : chr "Richard"
# ..$ : chr "Thomas"
# ..$ : chr "Craig"
# ..$ : chr "David"
# ..$ : chr "Aman"
# ..$ : chr "Frank"
# ..$ : chr "Robert"
# $ id   :List of 10
# ..$ : num 1551
# ..$ : num 1033
# ..$ : num 1061
# ..$ : num 1262
# ..$ : num 1032
# ..$ : num 1896
# ..$ : num 1080
# ..$ : num 1099
# ..$ : num 1679
# ..$ : num 1690
# $ mname:List of 10
# ..$ : chr "B"
# ..$ : NULL
# ..$ : chr "J"
# ..$ : chr "I"
# ..$ : chr "E"
# ..$ : chr "A"
# ..$ : chr "R"
# ..$ : NULL
# ..$ : chr "J"
# ..$ : chr "E"

【讨论】:

以上是关于将嵌套数据框扩展到父级的主要内容,如果未能解决你的问题,请参考以下文章

在嵌套环境中点击 childviewcontroller 中的单元格访问父级父级视图控制器的 tableview 委托

将子级扩展到父级可滚动内容的 100% 高度

layui弹窗 iframe嵌套页面内的弹窗如何覆盖到父级页面

JQuery Draggable 包含到父级和一些额外的

Java MySQL递归子级父级,构建树结构

Java MySQL递归子级父级,构建树结构