【问题标题】:Creating a mean value function, returning error message about NAs创建平均值函数,返回有关 NA 的错误消息
【发布时间】:2015-04-20 14:44:24
【问题描述】:

我正在尝试编写一个函数,该函数将返回跨多个 .csv 文件的列的平均值。但是,该函数似乎卡在我的平均计算上,因为它返回 NA 值:

pollutantmean <- function(directory, pollutant, id = 1:332){
  dy <- list.files("specdata", full.names = T)
  df <- data.frame()
  for(i in id){
    rbind(df,read.csv(dy[i]))
  }
  if(pollutant == "nitrate"){mean(df$nitrate, na.rm = TRUE)} 
  if(pollutant == "sulfate"){mean(df$sulfate, na.rm = TRUE)}
}

非常感谢您提出解决此问题的建议。

【问题讨论】:

  • 你肯定可以在这里找到有用的链接:stackoverflow.com/search?tab=newest&q=[r]%20pollutantmean
  • 我相信 read.csv 的默认行为是忽略标题。如果它没有得到名字,那么它就不会知道 df$nitrate 是什么。也许尝试将header = T 添加到 read.csv 部分?
  • @goodtimeslim 它确实得到了headerhead(read.csv('001.csv'),2) # Date sulfate nitrate ID 1 2003-01-01 NA NA 1 2 2003-01-02 NA NA 1
  • 我认为你在 for 循环中需要 df &lt;- rbind(df,read.csv(dy[i])),在 return(mean(df$nitrate...`) 中需要 return
  • 修复后尝试使用spec文件夹的功能..pollutantmean('nitrate', 1:2)#[1] 0.9038795; df1 &lt;- read.csv('001.csv'); df2 &lt;- read.csv('002.csv'); dfN &lt;- rbind(df1,df2); mean(dfN$nitrate, na.rm=TRUE)#[1] 0.9038795。在 pollutantmean 函数中,我没有使用目录,因为我使用 spec 文件夹作为工作目录。

标签: r csv mean


【解决方案1】:

尝试从您的自定义函数中显式返回平均值,如下所示:

pollutantmean <- function(directory, pollutant, id = 1:332) {
    dy <- list.files("specdata", full.names=TRUE)
    df <- data.frame()
    for (i in id) {
        df <- rbind(df, read.csv(dy[i]))
    }
    if(pollutant == "nitrate") { return(mean(df$nitrate, na.rm=TRUE)) }
    if(pollutant == "sulfate") { return(mean(df$sulfate, na.rm=TRUE)) }
}

如果这不能解决问题,那么您可能有包含字符数据的数据框列,导致R 为您提供NA 值。在pollutantmean函数中插入这两行,看看你是否在处理数字列:

print(class(df$nitrate))
print(class(df$sulfate))

如果您看到“因子”或除数字以外的任何内容,那么您将知道您的输入数据包含纯数字以外的内容。

【讨论】:

  • 感谢您的收获...我错过了 ^ ^
猜你喜欢
  • 1970-01-01
  • 2022-12-15
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多