我正在为我的(工作中的)R 脚本编写一个函数以清理我的代码。我没有编写函数的经验,但决定我应该花一些时间在这上面。我的函数的目标是执行多个统计测试,同时只传递所需的数据框、定量变量和分组变量一次。但是,我无法让它工作。为了您的引用,我将使用 ToothGrowth 数据框来说明我的问题。
假设我想在 len
上运行 Kruskal-Wallis 检验和单向方差分析,以比较名为 supp
的不同组,无论出于何种原因。我可以单独使用
kruskal.test(len ~ supp, data = ToothGrowth)
aov(len ~ supp, data = ToothGrowth)
现在我想编写一个函数来执行这两个测试。这是我认为应该起作用的:
stat_test <- function(mydata, quantvar, groupvar) {
kruskal.test(quantvar ~ groupvar, data = mydata)
aov(quantvar ~ groupvar, data = mydata)
}
但是如果我随后运行 stat_test(ToothGrowth, "len", "sup")
,我会得到错误
Error in kruskal.test.default("len", "supp") :
all observations are in the same group
我做错了什么?任何帮助将不胜感激!
最佳答案
您可以使用 deparse(substitute(quantvar))
获取您传递给函数的列的引用名称,这将允许您使用 paste< 构建公式
。这是在 R 中更惯用的操作方式。
这是一个可重现的例子:
stat_test <- function(mydata, quantvar, groupvar) {
A <- as.formula(paste(deparse(substitute(quantvar)), "~",
deparse(substitute(groupvar))))
print(kruskal.test(A, data = mydata))
cat("\n--------------------------------------\n\n")
aov(A, data = mydata)
}
stat_test(ToothGrowth, len, supp)
#>
#> Kruskal-Wallis rank sum test
#>
#> data: len by supp
#> Kruskal-Wallis chi-squared = 3.4454, df = 1, p-value = 0.06343
#>
#>
#> --------------------------------------
#> Call:
#> aov(formula = A, data = mydata)
#>
#> Terms:
#> supp Residuals
#> Sum of Squares 205.350 3246.859
#> Deg. of Freedom 1 58
#>
#> Residual standard error: 7.482001
#> Estimated effects may be unbalanced
由 reprex package 创建于 2020-03-30 (v0.3.0)
关于r - 在 R 中围绕统计测试编写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60928736/