ARTool包ART ANOVA输出emmGrid类列表转data.frame报错解决问询
问题原因
fit列存储的每个元素都是emmGrid类S4对象,普通的rbind.data.frame不支持直接处理S4类对象,因此触发子集化报错。emmGrid类本身内置了转换为数据框的方法,先对每个列表元素执行转换再合并即可。
解决方法
方案1:修改建模代码,生成结果时直接转换
你可以在原有嵌套建模的逻辑中新增一步,将每个art.con输出的emmGrid对象直接转成数据框:
Organism_df_posthoc <- bird_metrics_long_new %>% rbind(plant_metrics_long_new) %>% mutate(Type = factor(Type, levels = c("Forest", "Jungle rubber", "Rubber", "Oil palm"))) %>% mutate(Category = factor(Category)) %>% group_by(Category) %>% mutate_at(c("PD"), ~(scale(.) %>% as.vector())) %>% ungroup() %>% nest_by(n1) %>% mutate( fit = list(art.con(art(PD ~ Category + Type + Category:Type, data = data), "Category:Type",adjust = "tukey", interaction = T)), # 新增行:将emmGrid转为标准数据框 fit_df = list(as.data.frame(fit)) )
如果需要把所有分组的对比结果合并为一个总表,执行以下代码即可:
library(tidyverse) all_contrast_res <- Organism_df_posthoc %>% pull(fit_df) %>% bind_rows(.id = "n1_group")
参数.id会新增一列n1_group记录每条结果对应的原分组n1值,方便结果溯源。
方案2:直接处理已生成的fit列
如果已经跑完模型不想重新计算,可以直接对现有fit列做逐行转换:
all_contrast_res <- Organism_df_posthoc %>% rowwise() %>% summarise( n1 = n1, as.data.frame(fit), .groups = "drop" )
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

