将数据子集化为 R 中的通用函数

Subsetting data as generic function in R

我正在尝试创建一个函数来绘制整个数据集或数据子集的图形。该函数需要能够做到这两点,以便您可以根据需要绘制子集。我正在为提出通用子集函数而苦苦挣扎。

我目前有这段代码(我更像是一个 SAS 用户,所以 R 让我有点困惑):

subset<-function(dat, varname, val)
if(dat$varname==val) {
    data<-subset(dat, dat$varname==val) 
}

但 R 不断返回此错误消息:

Error in if (dat$varname == val) { : argument is of length zero

有人可以帮我解决这个问题吗?非常感谢!我想这可能与我写的方式有关。

首先所有的$运算符都不能处理变量。在您的代码中,您总是在查找名为 varname 的列。 将 $varname 替换为 [varname]。 下一个错误是您以向量为条件,dat$varname==val 将是布尔向量。 代码中的第三个错误是您正在命名函数子集,从而在基础包中覆盖了子集函数。因此,对 subset 的内部调用将是对您自己的函数的递归调用。要修复此问题,请重命名您的函数,或者您必须指定它是您使用 base::subset(dat, dat[varname]==val) 调用的基础包中的子集函数。 代码中的最后一个错误是您的函数没有 return 任何东西。不要将结果分配给变量数据,而是 return 它。

代码如下所示。

mySubset<-function(dat, varname, val)
if(any(dat[varname]==val)) {
    subset(dat, dat[varname]==val) 
} else {
    NA
}

甚至更好

mySubset <- function(dat,varname,val) dat[dat[varname] == val]