应用用户定义函数对 R 中的变量范围执行 t 检验时出现问题

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

我有一个用户定义的函数,可以按组计算 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()
查看错误发生的位置。”

有兴趣了解更多有关这两种方法的信息。

r user-defined-functions lapply t-test
1个回答
0
投票

一种方法是迭代名称列表而不是字符串。请注意,我们可以使用

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

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