我有一组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
这些错误意味着什么?
答案 0 :(得分:1)
我发现您的代码存在两个问题
list.files只列出你的文件。它不会将文件读取到工作空间
在子设置data.frame时,您必须将列名称作为字符。 例如:dat [,&#34; column_name&#34;]
我已经修改了这个功能,试试这个。
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]))
}