You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:24:07