如何否定子集论证
How to negate a subsetting argument
我正在编写一个对数据帧执行 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 档汽车,看看自动 (am=0) 汽车有 2 到 4 个化油器:
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 对象的对立面:A "not-NULL",或者一个简单地等于所有东西的通配符对象。如果不是,我可以修改我的代码以在子集化步骤中使用 NULL 对象吗?
使用关键字 "all"、"any" 和 "subset" 搜索通常 link 到引用函数 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" 出现在课程后面的事实。
我正在编写一个对数据帧执行 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 档汽车,看看自动 (am=0) 汽车有 2 到 4 个化油器:
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 对象的对立面:A "not-NULL",或者一个简单地等于所有东西的通配符对象。如果不是,我可以修改我的代码以在子集化步骤中使用 NULL 对象吗?
使用关键字 "all"、"any" 和 "subset" 搜索通常 link 到引用函数 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" 出现在课程后面的事实。