我正在尝试创建一个对数据进行Kruskal Wallis测试的函数,但是具有不同的分组类别。我试图创建的函数将能够使用感兴趣的不同分组类别的名称。我将我的代码基于类似这里的问题:
R: Kruskal-Wallis test in loop over specified columns in data frame
我正在尝试使用rlang 0.4包中的新curl-curly运算符。
https://www.tidyverse.org/articles/2019/06/rlang-0-4-0/
以下是我的问题的一个示例:
library(dplyr)
library(broom)
set.seed(123)
df <- tbl_df(data.frame(
group_cat1 = as.factor(rep(c("a", "b", "c"), each = 5)),
group_cat2 = as.factor(rep(c("x", "y", "z"), each = 5)),
var1 = runif(15, 0, 10),
var2 = runif(15, 0, 10),
var3 = runif(15, 0, 10)))
models_df <- df %>%
gather(variable, result, -group_cat1) %>%
group_by(variable) %>%
do(kruskal.test(x = .$result, g =.$group_cat1) %>% tidy())
这很好用,但是,如果我尝试通过定义一个函数来概括问题,我将无法使其正常工作。
get_linear_model <- function(group_category) {
df %>%
gather(variable, result, -{{group_category}}) %>%
group_by(variable) %>%
do(kruskal.test(x = .$result, g =.${{group_category}) %>% tidy())
}
我收到以下错误
Error: unexpected '{' in:
" group_by(variable) %>%
do(kruskal.test(x = .$result, g =.${"
我相信关于环境或通常如何使用这个新的curl-curly运算符,我缺少一些东西。我有点迷茫,因此不胜感激!
答案 0 :(得分:0)
对于第二种情况,我们可以使用[[
并将其转换为字符串,因为$
不能正常工作
get_linear_model <- function(group_category) {
df %>%
gather(variable, result, -{{group_category}}) %>%
group_by(variable) %>%
do(kruskal.test(x = .$result,
g = .[[rlang::as_name(enquo(group_category))]]) %>%
tidy())
}
models_df2 <- get_linear_model(group_cat1)
identical(models_df, models_df2)
#[1] TRUE
在OP的代码中,错误是由于括号不平衡引起的
...
do(kruskal.test(x = .$result, g =.${{group_category}) %>% tidy())
^^^ ^^^
2 1