问题在于res.aov 将输出作为tibble 类返回,而get_test_label 期望类为anova_test、rstatix_test。我们可以将group_split 变为list,在list 元素中单独应用anova_test,然后使用get_test_label,这样属性就不会丢失
library(dplyr)
library(purrr)
stacked_DVs %>%
group_split(DV) %>%
map(~ .x %>%
anova_test(value ~ Group) %>%
rstatix::get_test_label(detailed = TRUE))
#[[1]]
#paste("Anova, ", italic("F"), "(2,49)", " = ", "32.12, ", italic("p"),
# " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
#[[2]]
#paste("Anova, ", italic("F"), "(2,49)", " = ", "32.67, ", italic("p"),
# " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
或者另一种选择是nest_by
out <- stacked_DVs %>%
nest_by(DV) %>%
mutate(test = list(anova_test(value ~ Group, data = data)),
label = list(get_test_label(test, detailed = TRUE)))
out
# A tibble: 2 x 4
# Rowwise: DV
# DV data test label
# <chr> <list<tbl_df[,2]>> <list> <list>
#1 MP [52 × 2] <anova_test[,7]> <language>
#2 SE [52 × 2] <anova_test[,7]> <language>
out$label
#[[1]]
#paste("Anova, ", italic("F"), "(2,49)", " = ", "32.12, ", italic("p"),
# " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
#[[2]]
#paste("Anova, ", italic("F"), "(2,49)", " = ", "32.67, ", italic("p"),
# " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
检查 OP 对象的class
class(res.aov)
#[1] "tbl_df" "tbl" "data.frame"
class(out$test[[1]])
#[1] "anova_test" "data.frame" "rstatix_test"
class(out$test[[2]])
#[1] "anova_test" "data.frame" "rstatix_test"
如果我们对未分组的数据执行此操作,class 属性将为anova_test、rstatix_test
stacked_DVs %>%
anova_test(value ~ Group) %>%
class
#[1] "anova_test" "data.frame" "rstatix_test"
这与anova_test 处理grouped_df 的方式有关。这是源代码中的 sn-p,它执行if/else
anova_test
...
...
if (is_grouped_df(data)) {
results <- data %>% doo(~.anova_test(data = ., .args = .args,
effect.size = effect.size, error = error, observed = observed,
detailed = detailed), result = "anova")
if ("anova" %in% colnames(results)) {
results <- results %>% mutate(anova = map(.data$anova,
.append_anova_class))
}
}
else {
results <- .anova_test(data, .args = .args, effect.size = effect.size,
error = error, observed = observed, detailed = detailed) %>%
.append_anova_class()
}
所以,如果我们想使用doo,那么将输出放在list中
stacked_DVs %>%
group_by(DV) %>%
doo(~list(anova_test(value ~ Group, data = .))) %>%
mutate(label = map(`.results.`, ~ get_test_label(.x[[1]], detailed = TRUE))) %>%
pull(label)
#[[1]]
#paste("Anova, ", italic("F"), "(2,49)", " = ", "32.12, ", italic("p"),
# " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
#[[2]]
#paste("Anova, ", italic("F"), "(2,49)", " = ", "32.67, ", italic("p"),
# " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")