簡體   English   中英

在公式中將列名稱傳遞為 function arguments

[英]Pass column names as function arguments in formula

我想創建一個可重復使用的 function 進行重復 t 檢驗,以便可以將列名傳遞到公式中。 但是,我找不到讓它工作的方法。 所以下面的代碼就是這個想法:

library(dplyr)
library(rstatix)
do.function <- function(table, column, category) {
  column = sym(column)
  category = sym(category)
  
  stat.test <- table %>%
    group_by(subset) %>%
    t_test(column ~ category)
  
  return(stat.test)
}
tmp = data.frame(id=seq(1:100), value = rnorm(100), subset = rep(c("Set1", "Set2"),each=50,2),categorical_value= rep(c("A", "B"),each=25,4))
do.function(table= tmp, column = "value", category = "categorical_value")

我得到的當前錯誤如下:

Error: Can't extract columns that don't exist.
x Column `category` doesn't exist.
Run `rlang::last_error()` to see where the error occurred. 

問題是是否有人知道如何解決這個問題?

只需制作一個公式,而不是將它們包裝在sym中:

library(dplyr)
library(rstatix)
do.function <- function(table, column, category) {
  formula <- paste0(column, '~', category) %>% 
    as.formula()
  
  table %>%
    group_by(subset) %>%
    t_test(formula)
}
tmp = data.frame(id=seq(1:100), value = rnorm(100), subset = rep(c("Set1", "Set2"),each=50,2),categorical_value= rep(c("A", "B"),each=25,4))
do.function(table= tmp, column = "value", category = "categorical_value")
# A tibble: 2 x 9
  subset .y.   group1 group2    n1    n2 statistic    df     p
* <chr>  <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl> <dbl>
1 Set1   value A      B         50    50     0.484  94.3 0.63 
2 Set2   value A      B         50    50    -2.15   97.1 0.034

當我們傳遞字符串值時,我們可以只使用reformulate來創建公式中的表達式

do.function <- function(table, column, category) {
  
  
  stat.test <- table %>%
    group_by(subset) %>%
    t_test(reformulate(category, response = column ))
  
  return(stat.test)
}

-測試

> do.function(table= tmp, column = "value", category = "categorical_value")
# A tibble: 2 × 9
  subset .y.   group1 group2    n1    n2 statistic    df      p
* <chr>  <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>  <dbl>
1 Set1   value A      B         50    50     1.66   97.5 0.0993
2 Set2   value A      B         50    50     0.448  92.0 0.655 

公式實際上已經在rstatix::t_test中使用,我們通過它們的名稱get變量。

do.function <- function(table, column, category) {
  stat.test <- table  %>%
    mutate(column=get(column), 
           category=get(category)) %>%
    rstatix::t_test(column ~ category)
  return(stat.test)
}

do.function(table=tmp, column="value", category="categorical_value")
# # A tibble: 1 × 8
# .y.    group1 group2    n1    n2 statistic    df     p
# * <chr>  <chr>  <chr>  <int> <int>     <dbl> <dbl> <dbl>
# 1 column A      B        100   100     0.996  197.  0.32

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM