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

时间:2015-11-29 18:01:26

标签: r function subset

我正在尝试创建一个函数,用于绘制整个数据集或数据子集的图形。该函数需要能够同时执行这两项操作,以便您可以根据需要绘制子集。我正在努力提出通用子集函数。

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

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

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

  

if(dat $ varname == val){:参数长度为零

时出错

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

1 个答案:

答案 0 :(得分:2)

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

以下是代码的外观。

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]