【问题标题】:R: When concatenating CSV files and getting the mean for 1 variable I get correct answer for 1 file but incorrect for sequenceR:当连接 CSV 文件并获得 1 个变量的平均值时,我得到 1 个文件的正确答案,但序列不正确
【发布时间】:2014-07-07 23:32:29
【问题描述】:

我正在使用的 CSV 文件的 zip 链接:

https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip

代码:

getpollutant <- function(id=1:332, directory, pollutant) {
    data<-NULL
    for (i in 1:length(id)) {
            data[[i]]<- c(paste(directory, "/",formatC(id[i], width=3, flag=0),".csv",sep=""))     
    }
    df<-NULL
    for (d in 1:length(data)) { df[[d]]<-c(read.csv(data[d]))
    }
    m<-NULL
    for (i in  1:length(df)) {
            if (pollutant=="nitrate"){
                    m<-mean(df[[i]]$nitrate, na.rm=T)
            }
            if (pollutant=="sulfate"){
                    m<-mean(df[[i]]$sulfate, na.rm=T)
            }


    }
    m

}

当我使用 getpollutant 计算 1 个文件的硝酸盐或硫酸盐污染物平均值时,我得到了正确答案,但由于某种原因,当我尝试输入一系列文件时,我得到的平均值太高,我觉得它必须处理 NA 值的方式,但我找不到在平均计算中包含 NA 值的方法

【问题讨论】:

  • 如果您希望包含 NA 值,请先编写一个新数据框,在其中将 NA 值替换为 0,例如df$nitrate[is.na(df$nitrate)] &lt;- 0.

标签: r csv concatenation mean na


【解决方案1】:

在最后一个 for 循环中,您不断将文件的平均值重新评估为 m。这意味着m 将始终具有您阅读的最后一个文件的平均值。您没有努力跨文件组合数据。如果你愿意,你可以先收集所有数据点的向量,然后在最后取一个平均值

#before loop
v <- numeric()
#in loop
v <- c(v, df[[i]]$sulfate)
#after loop
mean(v, na.rm=T)

或者您可以存储总和和长度以自己计算平均值。

#before loop
total<-0; N<-0;
#in loop
total <- total + sum(df[[i]]$sulfate, na.rm=T)
N <- N + sum(!is.na(df[[i]]$sulfate))
#after loop
total/N

【讨论】:

  • 谢谢!,我只是一个初学者,在Python工作了很长时间后试图适应R。这很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
相关资源
最近更新 更多