1

我正在编写一个在数据帧上进行测试的函数,根据我定义的参数对数据进行子集化。这是一个使用 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 对象等价的东西:“非 NULL”,或简单地等于一切的通配符对象。如果不是,我可以修改我的代码以在子集步骤中使用 NULL 对象吗?

使用关键字“all”、“any”和“subset”进行搜索通常会链接到引用函数 all() 和 any() 的页面,但并没有让我进一步了解。我会很感激任何帮助,谢谢。

4

1 回答 1

0

随着弗兰克在评论中的贡献,这是一个可行的解决方案:

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

在我的原始代码中dfrm,我有一个文件路径,它被导入dfrmread.csv(). 该函数似乎没有问题处理参数中提到的“dfrm”出现在课程后面的事实。

于 2017-01-23T21:42:09.057 回答