用户定义函数难以对 R 中的多个变量执行操作

问题描述 投票:0回答:1

我正在对数据框中的变量进行 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 时的正确符号和用户定义函数范围的更多信息

r user-defined-functions scoping rstatix
1个回答
0
投票

尝试将

{{}}
表达式放入公式时需要更加小心,因为公式的左侧和右侧未计算。一种可能的解决方法是

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

© www.soinside.com 2019 - 2024. All rights reserved.