我正在对数据框中的变量进行 t 检验:
library(rstatix)
df <- data.frame(grouping = c(rep("left", 50), rep("right", 50)),
var1 = (rnorm(100, mean=21, sd=3)))
var1_result <- df %>%
t_test(var1 ~ grouping, paired = TRUE, detailed = TRUE) %>%
rstatix::add_significance()
var1_result
我对每个变量使用重复的代码行,但希望通过调用用户定义的函数来改进。我试过了
my_t_test <- function(dataset, parameter, grouping_variable) {
parameter <- dataset %>% t_test({{parameter}} ~ {{grouping_variable}}, paired = TRUE, detailed = TRUE) %>% add_significance()
return(parameter)
}
my_t_test(df, var1, grouping)
但是,我遇到了错误:“
pull()
中的错误:!无法提取不存在的列。✖列...
不存在。”
我发现了一些帖子,涉及在以 dplyr 风格编写的函数中调用 df 变量(例如,如何在 R 中编写一个接受 dplyr 等列名称的函数? & 在 dplyr 中编写作用域过滤器函数)
我尝试了按照第一篇文章的建议,用“...”编写函数的方法,但这不起作用,并且在概括其他文章中的任何解决方案时遇到困难。非常有兴趣了解有关使用 dplyr 时的正确符号和用户定义函数范围的更多信息
尝试将
{{}}
表达式放入公式时需要更加小心,因为公式的左侧和右侧未计算。一种可能的解决方法是
my_t_test <- function(dataset, parameter, grouping_variable) {
formula <- do.call("~", list(rlang::enexpr(parameter), rlang::enexpr(grouping_variable)))
parameter <- dataset %>% t_test(formula, paired = TRUE, detailed = TRUE) %>% add_significance()
return(parameter)
}
这里我们调用
~
函数来构建公式,并使用 enexpr
来捕获适当的符号。
这应该产生相同的输出
my_t_test(df, var1, grouping)
# A tibble: 1 × 14
estimate .y. group1 group2 n1 n2 stati…¹ p df conf.…² conf.…³ method
<dbl> <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 0.114 var1 left right 50 50 0.162 0.872 49 -1.30 1.53 T-test
# … with 2 more variables: alternative <chr>, p.signif <chr>, and abbreviated
# variable names ¹statistic, ²conf.low, ³conf.high
# ℹ Use `colnames()` to see all variable names
请注意,
{{}}
不是标准 R 语法,仅适用于使用 rlang
作为后端的包(主要是“tidyverse”中的包)。恰巧 rstatix::t_test
恰巧在后端使用了 dplyr