[英]Join across/within nested dataframes
我正在從模型中提取信息以進行最終繪圖。 我想要的圖是抖動的原始數據,覆蓋了平均值+/- STDERR和文本分組。 模型輸出將分組和估計放在列表中的單獨數據框中。 我正在使用地圖提取這些內容,並且可以正常工作,但是我堅持將它們連接在一起的步驟。
我想將兩個嵌套的list-cols合並到一個表中,並將其嵌套為新列。 目前,我能做的最好的事情就是取消嵌套,聯接表,再次嵌套以及聯接回到原始的嵌套表。
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:通過* list *列連接兩個表(小標題)
但這似乎不起作用,使用散列連接時出現相同的錯誤。 它確實有效,需要在嵌套中定義.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"))
答案顯然是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”對兩個表進行完全連接,並使用結果創建一個新的列表列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.