【发布时间】:2016-02-17 22:44:51
【问题描述】:
刚接触 R 和编程,我在此 Coursera 作业中查看了 SO 上所有可能的线程,但无法弄清楚问题所在。我知道这个功能可以使用 lapply 等等进行优化,但我想知道为什么这个特定的功能不起作用。我觉得关于这个功能的一些问题有点激怒了一些用户。老实说,我查看了相关的帖子,但我看不出我能对这个特定的错误做些什么。
pollutantmean <- function (directory, pollutant, id) {
#Create the data frame with the data from the 332 files
files <- list.files(getwd())
df <- data.frame()
id <- 1:332
for (i in 1:length(id)) {df <- rbind(df, read.csv(files[i]))
if (pollutant=="nitrate"){
#Create a subset for nitrate values of df
df_nitrate <- df[df$ID==id[i], "nitrate"]
#Take mean of df_nitrate
mean (df_nitrate, na.rm = TRUE)
} else {
#Create a subset for sulfate values of df
df_sulfate <- df[df$ID==id[i],"sulfate"]
#Take mean of df_sulfate
mean(df_sulfate, na.rm = TRUE)
}
}
}
对于那些没有听说过这个赋值功能的人:我的工作目录中有 332 个 csv 文件(名为 001.csv、002.csv 等)。任务是将它们全部放在一个数据框中,并能够调用文件列的平均值(由与该文件对应的“id”变量给出)或跨多个文件(函数和输出的一些示例可以找到here)
我尝试调用回溯或调试函数来定位问题,但无济于事:
pollutantmean(getwd(), "nitrate", 23)
> traceback()
No traceback available
> debug(pollutantmean)
>
操作系统是 Windows 10。
欢迎任何建议或cmets。提前致谢。
【问题讨论】:
-
到底是什么问题?错误信息是什么?
-
在
df[df$ID==id[i], "nitrate"],按id 过滤似乎是多余的,因为您正在加载指定id的CSV 文件。我认为您需要在加载所有 CSV 文件后计算 for 循环之外的平均值。 -
@MaxPD 没有消息,就是这样。
-
@KotaMori id 用于特定文件。每个文件都有一个硝酸盐和硫酸盐柱。但是,当我按照您的建议将循环限制为 rbind 时,它只处理第一个文件。
-
因为你有
df$ID==id[i],它只返回i的平均值。如果要计算多个文件的平均值,请删除此部分