如何映射数据框,这是一个潮汐错误吗?

How to map over dataframe, is it a tidyeval error?

想要映射数据框中的列并对每一列针对固定列执行 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.

遵循潮汐指导: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)
}

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

的列名

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

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

三件事正在发生:

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

我没有测试代码。

其实可能只是公式求值 具体来说:

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 一起使用的示例,但如果我这样做会重新 post