在用户定义的 R 函数中的 t.test() 中使用 paste()
Using paste() within t.test() in user defined R function
我正在尝试编写一个函数,它接受来自用户的 Var1
和 Var2
以及 运行 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 元素被强制转换为 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
我正在尝试编写一个函数,它接受来自用户的 Var1
和 Var2
以及 运行 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 元素被强制转换为 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