1

想要映射数据框中的列并针对固定列对每列执行 t 检验。所需的输出将是一个数据框,每行都是 t 检验结果 - 可以使用map_dfr一次映射过程

深入研究 tidy eval,不确定这是否是 tidy eval 错误 - 非常感谢任何帮助!

mtcars作为玩具数据集)

library(rstatix)

# Test single cases - good
compare_means(mpg ~ cyl, data = mtcars)
compare_means(disp ~ cyl, data = mtcars)
compare_means(hp ~ cyl, data = mtcars)

# Trial map - fail

mtcars %>%
  map(~compare_means(.x ~ cyl, data = mtcars))

Error: Can't subset columns that don't exist.
x Column `.x` doesn't exist.

遵循 tidyeval 指导:https ://tidyeval.tidyverse.org/dplyr.html 尝试查看是否引用/取消引用是问题,但没有骰子

# Abstract variables

test_data <- function(group_var) {
  quote_var <- enquo(group_var)
  data %>% compare_means(quote_var ~ cyl, data = mtcars)
}

4

2 回答 2

1

这是一个 NSE 错误,但不是 tidyeval。您正在映射内部的向量mtcars。您没有映射mtcars.

inject()上一个 rlang 版本开始,您可以使用非 tidyeval 函数进行一些 NSE 编程:

names(mtcars) %>% map(~ rlang::inject(compare_means(!!sym(.x) ~ cyl, data = mtcars))

正在发生三件事:

  • 我们映射数据框的名称
  • 我们将名称转换为符号,即 R 变量。
  • inject()我们使用and将该符号注入到公式中!!

我没有测试过代码。

于 2020-12-10T13:28:23.177 回答
0

实际上,它可能只是专门关于公式评估

library(ggpubr)
library(tidyverse)

# Test data with 2 Species only
iris.subset <- iris %>% 
  filter(Species != 'virginica')
# Test single case
iris.subset %>% 
  compare_means(Sepal.Width ~ Species, data = .)

# Test direct map - doesn't work
iris.subset[1:4] %>% 
  map(~compare_means(. ~ Species, data = iris.subset))

是关于公式评估的吗?测试as.formula()

as.formula(paste0(names(iris.subset[1]), " ~ Species"))

# Pipe into test
names(iris.subset[1:4]) %>% 
  map_df(~compare_means(formula = as.formula(paste0(., " ~ Species")), data = iris.subset))

成功!!

找不到可以使用的示例,mtcars但如果我这样做了,我会重新发布

于 2020-12-11T14:38:59.967 回答