如何将R函数参数传递给列的子集

时间:2014-05-21 18:30:16

标签: r function

首先我是新来的,这是我的第一篇文章,所以如果我没有做正确的事,我会提前道歉。我确实花时间先搜索一下但找不到我要找的东西。 其次,我很确定我违反了规则,因为这个问题与我正在进行的'coursera.org'R编程课程有关(这是作业的一部分)但截止日期已经过去,我现在已经失败了,我将在下个月重复这个话题,然后再试一次,但我现在正处于损害控制中,试图找出问题所在。

以下是我的代码: 我想要做的是从一系列文件中读取数据。这些文件是四列宽的标题:日期,硝酸盐,硫酸盐和id,包含各种数据行。

我试图写的函数应该取文件目录的参数,污染物(硝酸盐或硫酸盐)和编号文件集,例如:文件1和2,文件1到4等。函数的返回应该是所选文件中所选污染物的平均值。

我会使用像这样的调用来调用函数

pollutantmean("datafolder", "nitrate", 1:3)

并且返回应该只是一个数字,这是数据文件1到3中硝酸盐的平均值

好的,我希望我提供了足够的信息。其他可能有用的东西是:

  • 操作系统:Ubuntu
  • 语言:R
  • 收到错误讯息:

    警告讯息:  在is.na(x)中:是:na()应用于'NULL'类型的非(列表或向量)

正如我所说,数据文件是位于文件夹中的一系列文件,四列宽,并且行数不同。

我的功能代码如下:

pollutantmean <- function(directory, pollutant, id = 1:5) { #content of the function
#create a list of files, a vector I think
files_list <- dir(directory, full.names = TRUE) 
# Now create an empty data frame
dat <- data.frame()

# Next step is to execute a loop to read all the selected data files into the dataframe
for (i in 1:5) { 
    dat <- rbind(dat, read.csv(files_list[i]))
}

#subsets the rows matching the selected monitor numbers
dat_subset <- dat[dat[, "ID"] == id, ]

#identify the median of the pollutant and ignore the NA values
median(dat_subset$pollutant, na.rm = TRUE)
好吧,就是这样,通过反复试验,我很确定最后一行代码“median(dat_subset$pollutant, na.rm = TRUE)”似乎是个问题。我将一个论点传递给污染物的功能,该功能应该是硫酸盐或硝酸盐,但似乎dat_subset$pollutant代码的代码是不起作用的。不知怎的,我得到的污染物参数不会进入函数体。理想情况下,dat_subset$pollutant位应该等同于dat_subset$nitratedat_subset$sulfate,具体取决于提供给函数的参数。

1 个答案:

答案 0 :(得分:1)

如果您在对象中传递列名称(如果它存储在$中),则不能使用pollutant运算符进行子集化。因此,尝试使用[]进行子集,在您的情况下将是:

median(dat_subset[,pollutant], na.rm = TRUE)

median(dat_subset[[pollutant]], na.rm = TRUE)

这有用吗?