我正在尝试编写一个函数,该函数接受来自用户的Var1
和Var2
并运行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
答案 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)
的向量。然后,只有第一个元素被强制转换为formula
。 t.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