【问题标题】:Join across/within nested dataframes跨嵌套数据框/在嵌套数据框内加入
【发布时间】:2017-07-12 15:44:52
【问题描述】:

我正在从模型中提取信息以进行最终绘图。我想要的图是抖动的原始数据,带有均值 +/- STDERR 和文本分组的叠加。模型输出将分组和估计放在列表中的单独数据框中。我正在使用地图来提取它们并且它有效,但我坚持将它们连接在一起的步骤。

我想将两个嵌套的列表列连接到一个表中,并将结果嵌套为一个新列。我目前能做的最好的事情是取消嵌套,加入表,再次嵌套,然后加入原始嵌套表。

library(agricolae)
library(tidyverse)

fitHSD2<- function(d) HSD.test(aov(mpg ~ cyl, data= d), trt = "cyl")     # anova with Tukey HSD

carnestdf <-
    mtcars %>%
        group_by(gear) %>%
        nest() %>%
        mutate(mod = map(data, fitHSD2) # fit model
                        , estimates = map(mod, function(df) return(df$means)) # pull out estimates and StdErr
                        , estimates = map(estimates, function(df) return(rownames_to_column(df, var = "trt"))) #attach rownames as column for unnest
                        , grouping = map(mod, function(df) return(df$groups)) # pull out groupings
                        , grouping = map(grouping, function(df) mutate(df, trt = as.character(trt) # convert to character
                                                                                                        , trt = gsub("[[:space:]]*$", "", trt)
                                                                                                        , M = as.character(M)
                                                                                                        )
                                                    ) # remove whitespace at end for join
                        ) 

carnestdf

我可以取消嵌套并加入它们,但是我不能嵌套并加入它们。事实上,我可以...只需要定义加入键,否则它会尝试基于加入在嵌套的 DF 上,如果没有下面的散列,这将不起作用。

full_join(unnest(carnestdf , estimates), unnest(carnestdf , grouping)) %>%
group_by(gear) %>%
nest(.key = "estgrp") %>%
full_join(carnestdf, ., by = "gear")

我发现了这个:R: Join two tables (tibbles) by *list* columns

但它似乎不起作用,我在使用哈希加入时遇到同样的错误。 它确实起作用,需要在嵌套中定义 .key 所以它不是“数据”。仍然希望在不取消嵌套的情况下加入...:/

nestmerge <-
    full_join(unnest(carnestdf , estimates), unnest(carnestdf , grouping)) %>%
    group_by(gear) %>%
    nest(.key = "mergedestgrp") %>%
    mutate_all(funs(hash = map_chr(., digest::digest)))

carnestdf %>%
    mutate_all(funs(hash = map_chr(., digest::digest))) %>%
    full_join(., nestmerge) %>%
    select(-ends_with("hash"))

【问题讨论】:

  • 为澄清起见,我很乐意在嵌套数据框中将两者连接起来,或者提取、连接和连接回嵌套数据框作为新列。

标签: r tidyverse


【解决方案1】:

答案显然是 map2:

carnestdf <-
    mtcars %>%
        group_by(gear) %>%
        nest() %>%
        mutate(mod = map(data, fitHSD2) # fit model
                        , estimates = map(mod, function(df) return(df$means)) # pull out estimates and StdErr
                        , estimates = map(estimates, function(df) return(rownames_to_column(df, var = "trt"))) #attach rownames as column for unnest
                        , grouping = map(mod, function(df) return(df$groups)) # pull out groupings
                        , grouping = map(grouping, function(df) mutate(df, trt = as.character(trt) # convert to character
                                                                                                        , trt = gsub("[[:space:]]*$", "", trt)
                                                                                                        , M = as.character(M)
                                                                                                        )
                                                    ) # remove whitespace at end for join
                        , estgrp = map2(estimates, grouping, ~full_join(.x, .y, by = "trt"))
                        ) 

carnestdf

这通过“trt”对两个表进行完全连接,并使用结果创建一个新的列表列。

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2023-03-20
    • 2021-02-05
    相关资源
    最近更新 更多