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

时间:2018-02-24 18:20:38

标签: r function user-defined

我正在尝试编写一个函数,该函数接受来自用户的Var1Var2并运行t.test并返回女性分类的均值。但我得到了计算线的错误。如果我在没有粘贴和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")

这是头(quine)

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

2 个答案:

答案 0 :(得分:1)

这应该有效:

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")

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

答案 1 :(得分:0)

在函数中包含代码行

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

看看有什么不对。 paste将向量dat[[Var1]]的每个元素与向量dat[[Var2]]的每个元素粘贴在一起。结果是长度为nrow(dat)的向量。然后,只有第一个元素被强制转换为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