首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据帧(emmGrid类)转换列表

从数据帧(emmGrid类)转换列表
EN

Stack Overflow用户
提问于 2021-10-30 22:09:39
回答 1查看 132关注 0票数 1

我想将一个列表转换为dataframe (下图)

我确实使用了do.call(rbind.data.frame, contrast),但是,我得到了这个Error in xi[[j]] : this S4 class is not subsettable。我还是可以分开读。有人知道这件事吗?

使用包ARTool运行anova测试时得到的列表

更新

这是我的原始代码,用来计算和完成模型。

代码语言:javascript
复制
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)))

我已经展示了fit的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-30 22:14:31

使用rbind,而不是rbind.data.frame,有一个“emmGrid”对象的特定方法,如果只指定rbind,它可以通过匹配class直接使用正确的方法

代码语言:javascript
复制
do.call(rbind, contrast)

-output

代码语言:javascript
复制
wool tension emmean   SE df lower.CL upper.CL
 A    L         44.6 3.65 48     33.6     55.5
 A    M         24.0 3.65 48     13.0     35.0
 A    H         24.6 3.65 48     13.6     35.5
 B    L         28.2 3.65 48     17.2     39.2
 B    M         28.8 3.65 48     17.8     39.8
 B    H         18.8 3.65 48      7.8     29.8
 A    L         44.6 3.65 48     33.6     55.5
 A    M         24.0 3.65 48     13.0     35.0
 A    H         24.6 3.65 48     13.6     35.5
 B    L         28.2 3.65 48     17.2     39.2
 B    M         28.8 3.65 48     17.8     39.8
 B    H         18.8 3.65 48      7.8     29.8

Confidence level used: 0.95 
Conf-level adjustment: bonferroni method for 12 estimates 

原因是在加载rbind时有一个特定的emmeans方法。

代码语言:javascript
复制
> methods('rbind')
[1] rbind.data.frame  rbind.data.table* rbind.emm_list*   rbind.emmGrid*    rbind.grouped_df* rbind.zoo*  

创建的示例中的结构与OP的结构显示的匹配

通过使用rbind.data.frame,它不匹配,因为类已经是emmGrid

数据

代码语言:javascript
复制
library(multcomp)
library(emmeans)


warp.lm <- lm(breaks ~ wool*tension, data = warpbreaks)

warp.emmGrid <- emmeans(warp.lm, ~ tension | wool)
contrast <- list(warp.emmGrid, warp.emmGrid)

如果OP使用'ARTool‘,如果列不同,则上述解决方案可能无法工作,因为rbind要求所有对象都具有相同的列名。我们可以通过使用tibble循环list (来自purrr)来转换为map并绑定它们。

代码语言:javascript
复制
library(ARTool)
library(purrr)
library(tibble)
map_dfr(contrast, as_tibble)

-output

代码语言:javascript
复制
# A tibble: 42 × 8
   contrast estimate    SE    df t.ratio  p.value Moisture_pairwise Fertilizer_pairwise
   <chr>       <dbl> <dbl> <dbl>   <dbl>    <dbl> <fct>             <fct>              
 1 m1 - m2    -23.1   4.12  8.00  -5.61  0.00226  NA                NA                 
 2 m1 - m3    -33.8   4.12  8.00  -8.20  0.000169 NA                NA                 
 3 m1 - m4    -15.2   4.12  8.00  -3.68  0.0256   NA                NA                 
 4 m2 - m3    -10.7   4.12  8     -2.59  0.118    NA                NA                 
 5 m2 - m4      7.92  4.12  8      1.92  0.291    NA                NA                 
 6 m3 - m4     18.6   4.12  8      4.51  0.00849  NA                NA                 
 7 NA           6.83 10.9  24      0.625 0.538    m1 - m2           f1 - f2            
 8 NA          15.3  10.9  24      1.40  0.174    m1 - m3           f1 - f2            
 9 NA          -5.83 10.9  24     -0.533 0.599    m1 - m4           f1 - f2            
10 NA           8.50 10.9  24      0.777 0.445    m2 - m3           f1 - f2            
# … with 32 more rows

数据

代码语言:javascript
复制
data(Higgins1990Table5, package = "ARTool")
m <- art(DryMatter ~ Moisture*Fertilizer + (1|Tray), data=Higgins1990Table5)
a1 <- art.con(m, ~ Moisture)
a2 <- art.con(m, "Moisture:Fertilizer", interaction = TRUE)
contrast <- list(a1, a2)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69782492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档