从 R 语言中的 CSV 文件的特定列中获取数据的问题

Issue with picking up data from a specific column of a CSV file in R Language

我有 100 个 csv 文件,我打算如下所述选择和计算 sulfate/nitrate 列中存在的数据总和。

CSV 格式为:

Date   sulfate nitrate ID

1/1/2003    NA  NA  1
1/2/2003    NA  NA  1
1/3/2003    NA  NA  1
1/4/2003    NA  NA  1
1/5/2003    NA  NA  1
1/6/2003    NA  NA  1
1/7/2003    NA  NA  1
1/8/2003    NA  NA  1
1/9/2003    NA  NA  1
1/10/2003   NA  NA  1
1/11/2003   NA  NA  1
1/12/2003   NA  NA  1
1/13/2003   NA  NA  1
1/14/2003   NA  NA  1
1/15/2003   NA  NA  1
1/16/2003   NA  NA  1
1/17/2003   NA  NA  1
1/18/2003   NA  NA  1
1/19/2003   NA  NA  1

所有 100 个文件都在一个文件夹中,名称为 001.csv、002.csv...100.csv

这里的ID是csv文件的名字。所有 100 个文件都具有上述格式。

这是我到目前为止编写的代码:

pollutantmean <- function(directory,pollutant,id = 1:332)
{
  test<- c('sulfate','nitrate')
  for(i in seq_along(id))
  {
    j<-formatC(i, width=3, flag="0")
    temp<-"C:/Users/Himanshu/Downloads/rprog-data-specdata/"
    temp1<-paste(temp,directory,sep="")
    filepath<- file.path(temp1,paste(j,".csv",sep=""))

    if(test[1]==pollutant)
    {
      data<-read.csv(filepath,header = TRUE, sep = "\t",colClasses=c(NA,"sulfate",NA,NA))
      sum(x=data,na.rm=FALSE)
    }
    else if(test[2]==pollutant)
    {
      data<-read.csv(filepath,header = TRUE, sep = "\t",colClasses=c(NA,NA,"nitrate",NA))
      sum(x=data,na.rm=FALSE)
    }
    data
  }

}

我在 R studio 的命令提示符下执行语句时遇到以下错误 -

data<-read.csv(filepath,header = TRUE, sep = "\t")[,c('nitrate')]

错误--

Error in `[.data.frame`(read.csv(filepath, header = TRUE, sep = "\t"),  : 
  undefined columns selected 

我尝试的另一种方法是 -

data<-read.csv(filepath,header = TRUE, sep = "\t",colClasses=c(NA,"sulfate",NA,NA))

本例中的错误是--

Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :
  cols = 1 != length(data) = 4

这是用户将在 R 的命令提示符中输入的内容 -

pollutantmean("specdata", "nitrate", 1:72)

这里第一个参数是目录引用,第二个参数是列名引用,第三个参数是要提取的 CSV 文件的数量。

pollutantmean <- function(directory,pollutant,id=1:332){
  #pollutant can be only character: "sulfate" or "nitrate"
# id is numeric and can take values from 1 to 332
    temp<-paste0("C:/Users/Himanshu/Downloads/rprog-data-specdata/",directory)


for (i in seq_along(id)){
   j<-formatC(i, width=3, flag="0")
        filepath<- file.path(temp,paste0(j,".csv"))
        data<-read.csv(filepath,header = TRUE, sep = ",")
      if (pollutant=="sulfate"){
      return(sum(data[complete.cases(data[,"sulfate"]),"sulfate"]))
      } 
      if (pollutant=="nitrate"){
        return(sum(data[complete.cases(data[,"nitrate"]),"nitrate"]))
      }
    }
}

#check

 pollutantmean (test,"sulfate",1:332) 
  • 我认为 if 语句是不必要的。
  • 我很懒,所以我用
    的 Magrittr 管道把东西连在一起 dplyr (%>%)
  • 我也认为 lapply 是阅读的方式 所有这些 csv.

所以这一切所做的是: 然后创建名称列表 然后将所有 csvs 读入列表 然后获取每个 csv 的指定总和 将总和列表减少到 data.frame 然后 将 csv 名称列添加到 data.frame

我希望这能奏效。

pollutantmean <- function(directory,pollutant,id=1:332){
  require(dplyr)
  formatC(seq_along(id), width=3, flag="0") %>% 
    paste0(.,'.csv') %>% 
  file.path("C:","Users","Himanshu","Downloads","rprog-data-specdata",directory,.) %>%
    lapply(.,{. %>% read.csv(.,header = TRUE, sep = ",")}) %>%
        bind_rows() %>%
        select(pollutant=contains(pollutant)) %>% 
        summarise(mean=mean(pollutant,na.rm=T)) %>% 
    .$mean
}

编辑

发现打字错误