在用户定义的 R 函数中的 t.test() 中使用 paste()

Using paste() within t.test() in user defined R function

我正在尝试编写一个函数,它接受来自用户的 Var1Var2 以及 运行 t.test 和 return 女性分类的平均值.但是我收到了计算行的错误。如果我 运行 没有粘贴和 as.formula 功能的程序和 运行 有 t.test(dat[[Var2]]~dat[[Var1]] 我会得到正确的答案。

但在我的原始代码中,我需要使用粘贴功能。谁能告诉我下面使用 paste 和 as.formula 函数的代码有什么错误?我正在使用 MASS 库中的 quine 数据框。

func = function(dat=quine,Var1,Var2){
  # calc = t.test(dat[[Var2]]~dat[[Var1]] #gives the answer
  calc = t.test(as.formula(paste(dat[[Var2]], dat[[Var1]], sep="~"))) #gives an error
  return(F.mean = calc$estimate[1])
}

func(Var1= "Sex", Var2= "Days")

这是头(奎因)

Eth Sex Age Lrn Days

1 A M F0 SL 2

2 A M F0 SL 11

3 A M F0 SL 14

4 A M F0 AL 5

5 A M F0 AL 5

6 A M F0 AL 13

这应该有效:

func <- function(dat = quine, Var1, Var2){
  calc = t.test(as.formula(paste("dat[[Var2]]", "dat[[Var1]]", sep = "~"))) 
  return(F.mean = calc$estimate[1])
}

func(Var1 = "Sex", Var2 = "Days")

注意粘贴字符串和对象之间的区别。

在函数中包含代码行

print(paste(dat[[Var2]], dat[[Var1]], sep="~"))

看看有什么问题。 paste 将向量 dat[[Var1]] 的每个元素与向量 dat[[Var2]] 的每个元素粘贴在一起。结果是一个长度为 nrow(dat) 的向量。然后,只有 first 元素被强制转换为 formulat.test 只使用了那个。

正确的代码是(注意 data 参数):

func = function(dat=quine,Var1,Var2){
  # calc = t.test(dat[[Var2]]~dat[[Var1]] #gives the answer
  calc = t.test(as.formula(paste(Var2, Var1, sep="~")), data = dat)
  return(c(F.mean = unname(calc$estimate[1])))
}

另请注意 return 指令是如何更改的。

虽然我们没有样本数据来测试功能,但我们可以编一些东西。

set.seed(8294)
n <- 100
quine <- data.frame(Sex = sample(c("M", "F"), n, TRUE), Days = runif(n))

func(Var1= "Sex", Var2= "Days")
#   F.mean 
#0.5100037