首页 > 解决方案 > 如何将数字向量放入函数而不是R中的字符?

问题描述

假设我有一个数据框:

gr <- c(0,0,1,0,1,1)
x <- c(10, 11, 12, 13, 14, 15)
y <- c(20, 21, 22, 23, 24, 25)
z <- c(30, 31, 32, 33, 34, 35)
data <- data.frame(gr, x, y, z)

我想t.test在我的数据框中执行所有变量。为此,我编写了一个函数

t_test <- function(var){
  p <- t.test(var ~ gr)$p.value
  t <- t.test(var ~ gr)$statistic
  
  if (p < 0.05) {
    des <- 'good'
  } else { des <- 'bad'}
  
  out <- list(p, t, des)
  return(out)
}

然后我想表演t.test

我发现如果我将列名放入函数中,则该函数不起作用。例如

t_test('x')

在这种情况下会发生错误。但是当我运行以下代码时

t_test(x)

即没有引号一切正常。

如何解决这个问题?这非常重要,因为我有一个包含 80 列的数据框,我需要像这样循环执行此测试:

data_colnames <- names(data)[2:ncol(data)]
t_test_data <- data.frame(matrix(ncol = 4, nrow = 0))
names(t_test_data) <- c("variable", "t_stat", "p_value", "decision")

for (i in 1:length(data_colnames)){
  t_test_data[i,  'variable'] <-  data_colnames[i]
  t_test_data[i, 't_stat']  <- t_test(data_colnames[i])[2]
}

标签: r

解决方案


我们可以使用pastereformulate从字符串输入创建公式。在 OP 的代码中,构建了两次模型以访问“p.value”和“statistic”。相反,构建模型一次并通过将其分配给对象('tmodel')来提取组件

t_test <- function(var){
  tmodel <- t.test(reformulate("gr", response = var))
  p <- tmodel$p.value
  t <- tmodel$statistic
  
  if (p < 0.05) {
    des <- 'good'
  } else { des <- 'bad'}
  
  out <- list(t, p, des)
  return(out)
}

-测试

> t_test("x")
[[1]]
        t 
-1.870829 

[[2]]
[1] 0.1347019

[[3]]
[1] "bad"

对于多种情况,请执行

> sapply(data_colnames, \(x) setNames(t_test(x), names(t_test_data)[-1]))
               x         y         z        
t_stat   -1.870829 -1.870829 0.1492787
p_value  0.1347019 0.1347019 0.8931025
decision "bad"     "bad"     "bad" 

或使用 OP 的for循环

for (i in seq_along(data_colnames)){ 
    t_test_data[i,  'variable'] <-  data_colnames[i]
   t_test_data[i, -1] <- t_test(data_colnames[i])
 }

-输出

> t_test_data
  variable     t_stat   p_value decision
1        x -1.8708287 0.1347019      bad
2        y -1.8708287 0.1347019      bad
3        z  0.1492787 0.8931025      bad

推荐阅读