R 3.1.0用于获取具有NA值的列的平均值的函数

时间:2014-06-16 04:51:09

标签: r csv

我有一组CSV文件。每个CSV文件上都有一个唯一的ID,其他列如" date"," sulfate","硝酸盐"。这是关于空气污染的数据。

该函数必须使用3个参数:"目录","污染物"," id"。

这是原始数据格式(对于001.csv文件):

Date        Sulfate    Nitrate    ID
2013-02-04  2.27       NA         1
2013-02-05  NA         1.15       1

到目前为止,这是我的功能:

pollutantmean <- function (directory, pollutant, id = 1:332){
  files_full <- list.files (directory, full.names = TRUE)
  dat <- data.frame ()
  for (i in id){
    dat <- rbind (dat, files_full[i])
  }
  datasub <- dat[,pollutant]
  }

1)当用户输入此内容时:     污染物(&#34; specdata&#34;,&#34;硝酸盐&#34;,70:72)

他们应该得到(DESIRE OUTPUT):
      的 1.706

相反,我得到:

Error in `[.data.frame`(dat, , pollutant) : undefined columns selected 

 In addition: Warning messages:
1: In `[<-.factor`(`*tmp*`, ri, value = "specdata/071.csv") :
  invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, ri, value = "specdata/072.csv") :
  invalid factor level, NA generated

这些错误意味着什么?

1 个答案:

答案 0 :(得分:1)

我发现您的代码存在两个问题

  1. list.files只列出你的文件。它不会将文件读取到工作空间

  2. 在子设置data.frame时,您必须将列名称作为字符。 例如:dat [,&#34; column_name&#34;]

  3. 我已经修改了这个功能,试试这个。

        pollutantmean <- function (directory, pollutant, id = 1:332){
          files_full <- list.files (directory, full.names = TRUE)
          dat <- data.frame()
          for (i in id){
    
            dat <- rbind (dat, read.table(files_full[i],sep="",.......))
          }
          datasub <- dat[,"pollutant"]
    
      }
    

    更快的方法是使用data.table包。要在此警告您,您需要仅将列名称赋予子集data.table而不是字符。 例如:dat [,column_name]

        pollutantmean <- function (directory, pollutant, id = 1:332){
          library(data.table)
    
          files_full <- list.files (directory, full.names = TRUE)
          dat_list <- list()
          for (i in id){
    
            dat_list[[i]] <- fread(files_full[i],sep="",.......)
          }
          dat <- rbindlist(dat_list)
          return(mean(dat[,pollutant]))
    
      }