提问人:marcel 提问时间:7/28/2023 最后编辑:jpsmithmarcel 更新时间:7/28/2023 访问量:43
用户定义函数难以在 R 中对多个变量执行操作
Difficulty with user-defined function to perform operation on multiple variables in R
问:
我正在对数据帧中的变量进行 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 时了解有关使用用户定义函数的正确表示法和范围的更多信息
答:
0赞
MrFlick
7/28/2023
#1
尝试将表达式放入公式时需要更加小心,因为公式的左侧和右侧未计算。一种可能的解决方法是{{}}
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 语法,仅适用于用作后端的包(主要是“tidyverse”中的包)。碰巧在后端使用{{}}
rlang
rstatix::t_test
dplyr
评论
0赞
marcel
7/28/2023
这似乎有效,但 rlang.r-lib.org/reference/defusing-advanced.html 有一些关于使用“enexpr”的温和警告语言,说:“ enexpr() 和 enexprs() 类似于 enquo() 和 enquos(),但返回裸表达式而不是 quosures。这些运算符应该很少使用,因为它们会跟踪化解参数的环境。使用这种方法有风险吗?
0赞
MrFlick
7/28/2023
我不确定为什么你可能会提到“风险”类型。但是在这种情况下,您正在尝试将这些参数作为符号名称传递,您明确不希望调用环境,因为您希望在数据框中查找这些符号。
评论