我正在编写一个函数,该函数对数据帧进行t测试,根据我定义的参数对数据进行子集设置。下面是一个使用mtcars数据的工作示例:
testfunc <- function(dfrm, varq, factor, gear = FALSE,
am = FALSE, carb = FALSE){
# Subset the data according to the arguments:
subsetdfrm <- dfrm[which((dfrm[,"gear"] %in% gear) &
(dfrm[,"am"] %in% am) &
(dfrm[,"carb"] %in% carb)),]
# Grab the groups to be compared according to arguments:
factorbinary <- get(factor)
# The t-test:
t <- t.test(dfrm[which(dfrm[factor]==factorbinary[1]), varq],
dfrm[which(dfrm[factor]==factorbinary[2]), varq],
data = subsetdfrm)
print(t)
}
以下是实际操作中的功能,比较3挡汽车与4挡汽车,观察配备2至4个化油器的自动(am=0)汽车:
testfunc(mtcars, "mpg", "gear", gear = c(3,4), am = 0, carb = c(2:4))
请注意,我将参数的默认值定义为"FALSE"。我想要的是为这些参数找到一个默认值,它会自动否定子集,这意味着所有值都包含在内。我自己最好的解决方案是在函数开头为每个参数添加if()子句,如下所示:
if(carb == FALSE){gear <- unique(dfrm$gear)}
if(am == FALSE){am <- unique(dfrm$am)}
if(carb == FALSE){carb <- unique(dfrm$carb)}
一旦参数数量增加,这将变得难以管理。有没有一个默认值我可以将参数设置为,从而否定子集?
我想象一个与NULL对象相反的东西:一个"not NULL",或者一个通配符对象,它只是等于所有的东西。如果没有,我可以修改我的代码以在子设置步骤中使用NULL对象吗?
使用关键字"all"、"any"one_answers"subset"进行搜索通常会链接到引用函数all()和any()的页面,但不会让我得到更多信息。如果有任何帮助,我将不胜感激。
Frank在评论中做出了贡献,下面是一个有效的解决方案:
testfunc <- function(dfrm, varq, factor, gear = unique(dfrm$gear),
am = unique(dfrm$am), carb = unique(dfrm$carb)){
# Subset the data according to the arguments:
subsetdfrm <- dfrm[which((dfrm[,"gear"] %in% gear) &
(dfrm[,"am"] %in% am) &
(dfrm[,"carb"] %in% carb)),]
# Grab the groups to be compared according to arguments:
factorbinary <- get(factor)
# The t-test:
t <- t.test(dfrm[which(dfrm[factor]==factorbinary[1]), varq],
dfrm[which(dfrm[factor]==factorbinary[2]), varq],
data = subsetdfrm)
print(t)
}
在我的原始代码中,我有一个由read.csv()
导入为dfrm
的文件路径,而不是dfrm
。该函数在处理参数中引用的"dfrm"在本课程稍后出现的事实时似乎没有问题。