我有一个用户定义的函数,可以按组计算 t 检验,但在迭代应用一系列变量时遇到一些问题
require(dplyr)
require(rstatix)
require(purrr)
# make df
mydf <- data.frame("category" = as.factor(sample(c("type1", "type2"), 50, replace = TRUE)),
"var1" = runif(50, min = 0, max = 100),
"var2" = runif(50, min = 50, max = 150))
# t test function (works)
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 = FALSE, detailed = TRUE) %>% add_significance()
return(parameter)
}
# apply to one var (gives desired output)
my_t_test(mydf, var1, category)
现在问题来了。我想为所有变量做:
vars <- c("var1", "var2")
trial <- lapply(mydf[ , vars], my_t_test, grouping_variable = category) #try 1 w/ lapply
tests <- map(vars, ~my_t_test(mydf, .x, category)) # try 2 w map
每种情况都有错误。通过 lapply 我得到: “ UseMethod(“pull”) 中的错误: 没有适用于“c('double', 'numeric')”类对象的“pull”方法。
使用地图功能我得到: “
map()
中的错误:
ℹ 索引:1。
由pull()
中的错误引起:
!无法提取不存在的列。
✖ .x
列不存在。
运行 rlang::last_trace()
查看错误发生的位置。”
有兴趣了解更多有关这两种方法的信息。
一种方法是迭代名称列表而不是字符串。请注意,我们可以使用
rlang::new_formula
基于带引号的变量名称创建公式。
library(dplyr)
library(rstatix)
library(purrr)
my_t_test <- function(dataset, parameter, grouping_variable) {
formula <- rlang::new_formula(rlang::enexpr(parameter), rlang::enexpr(grouping_variable))
parameter <- dataset %>% rstatix::t_test(formula, paired = FALSE, detailed = TRUE) %>% rstatix::add_significance()
return(parameter)
}
vars <- c("var1", "var2")
var_nms <- map(set_names(vars), as.name)
tests <- map(var_nms, ~ my_t_test(mydf, !! .x, category))
tests
#> $var1
#> # A tibble: 1 × 16
#> estimate estimate1 estimate2 .y. group1 group2 n1 n2 statistic p
#> <dbl> <dbl> <dbl> <chr> <chr> <chr> <int> <int> <dbl> <dbl>
#> 1 -7.92 54.5 62.5 var1 type1 type2 24 26 -0.919 0.363
#> # ℹ 6 more variables: df <dbl>, conf.low <dbl>, conf.high <dbl>, method <chr>,
#> # alternative <chr>, p.signif <chr>
#>
#> $var2
#> # A tibble: 1 × 16
#> estimate estimate1 estimate2 .y. group1 group2 n1 n2 statistic p
#> <dbl> <dbl> <dbl> <chr> <chr> <chr> <int> <int> <dbl> <dbl>
#> 1 -9.74 99.9 110. var2 type1 type2 24 26 -1.19 0.239
#> # ℹ 6 more variables: df <dbl>, conf.low <dbl>, conf.high <dbl>, method <chr>,
#> # alternative <chr>, p.signif <chr>
另一种方法是使用基本 R 的
reformulate
并让你的函数使用字符串:
my_t_test <- function(dataset, parameter, grouping_variable) {
formula <- reformulate(grouping_variable, parameter)
parameter <- dataset %>% rstatix::t_test(formula, paired = FALSE, detailed = TRUE) %>% rstatix::add_significance()
return(parameter)
}
vars <- c("var1", "var2")
tests <- map(vars, ~ my_t_test(mydf, .x, "category"))
tests
#> [[1]]
#> # A tibble: 1 × 16
#> estimate estimate1 estimate2 .y. group1 group2 n1 n2 statistic p
#> <dbl> <dbl> <dbl> <chr> <chr> <chr> <int> <int> <dbl> <dbl>
#> 1 10.1 52.7 42.6 var1 type1 type2 30 20 1.14 0.263
#> # ℹ 6 more variables: df <dbl>, conf.low <dbl>, conf.high <dbl>, method <chr>,
#> # alternative <chr>, p.signif <chr>
#>
#> [[2]]
#> # A tibble: 1 × 16
#> estimate estimate1 estimate2 .y. group1 group2 n1 n2 statistic p
#> <dbl> <dbl> <dbl> <chr> <chr> <chr> <int> <int> <dbl> <dbl>
#> 1 13.5 98.4 85.0 var2 type1 type2 30 20 1.56 0.127
#> # ℹ 6 more variables: df <dbl>, conf.low <dbl>, conf.high <dbl>, method <chr>,
#> # alternative <chr>, p.signif <chr>
来自OP的数据
# make df
mydf <- data.frame("category" = as.factor(sample(c("type1", "type2"), 50, replace = TRUE)),
"var1" = runif(50, min = 0, max = 100),
"var2" = runif(50, min = 50, max = 150))
创建于 2023-08-03,使用 reprex v2.0.2