【问题标题】:R - Mean always returns 0R - 平均值总是返回 0
【发布时间】:2017-08-10 18:12:25
【问题描述】:

我的目标是创建一个函数,从工作目录中读取指定的 .csv 文件(所有这些文件都具有相同的格式),将它们绑定到一个数据帧中,然后返回指定列的平均值(“nitrate”或“硫酸盐”)该数据帧。当前的问题是,每次我调用函数无论我选择读取多少文件/计算平均值的行数,该函数总是返回 0。我不太确定如何为了解决这个问题,任何帮助表示赞赏。

pollutantmean <- function(pollutant, id = 1:332, directory = 
                            "/Users/marsh/datasciencecoursera/specdata/") {
  setwd(directory)
  list <- list.files()
  df <- data.frame()
  for(i in id) {
        x <- read.csv(list[i])
        df <- rbind(df,x)
  }
  mean(!is.na(df["pollutant",]))
}

【问题讨论】:

    标签: r for-loop dataframe mean rbind


    【解决方案1】:

    如果您想要平均值并且您的数据中存在NA,请使用:mean(df["pollutant",], na.rm = TRUE)

    您正在计算存在多少NA 的比率。如果返回 0,则意味着您只有 NA's 。所以也许还有其他问题。也许您可以在数据框上使用dput(),以便我们查看。

    【讨论】:

      【解决方案2】:

      语法错误。应该是

      mean(!is.na(df[[pollutant]]))
      

      pollutant 不需要引号,并且应该与输入参数相同。其次,, 意味着我们选择行名作为索引的一般格式是row, column,它可以是numericcharacter 字符串。在这种情况下,我们需要计算特定列的缺失值mean。所以[[ 将提取列或者我们可以这样做

      mean(!is.na(df[,pollutant]))
      

      整个函数现在应该是

      pollutantmean <- function(pollutant, id = 1:332, directory = 
                              "/Users/marsh/datasciencecoursera/specdata/") {
        setwd(directory)
        list <- list.files()
        df <- data.frame()
        for(i in id) {
           x <- read.csv(list[i])
           df <- rbind(df,x)
         }
        mean(!is.na(df[[pollutant]]))
      }
      

      这也可以使用data.table进行优化

      library(data.table)
      pollutantmean <- function(pollutant, id = 1:332, directory = 
                              "/Users/marsh/datasciencecoursera/specdata/") {
        setwd(directory)
        lst <- list.files()
        df <- rbindlist(lapply(lst, fread))
         mean(!is.na(df[[pollutant]]))
        }
      

      【讨论】:

        【解决方案3】:

        只是一个猜测,因为没有数据可以证实这一点,但看起来您要求的是标记为污染物的行的平均值,而不是列的平均值。

        通常,变量保存在列中,单个观察值保存在行中。因此,移动该逗号将有助于将正确的数据纳入您的计算,为您提供rows(observations)column="pollutant"

        #how the data frame is constructed df[rows, columns]
        

        通过询问您所做的方式,您获得了该行中没有 NA 的所有观察值,但您取了整个数据框的平均值。

        pollutantmean <- function(pollutant, id = 1:332, directory = 
                                    "/Users/marsh/datasciencecoursera/specdata/") {
              setwd(directory)
              list <- list.files()
              df <- data.frame()
              for(i in id) {
                    x <- read.csv(list[i])
                    df <- rbind(df,x)
              }
        
              mean(df[,pollutant], rm.na=TRUE)
            }
        

        这表示取数据框dfpollutant 中所有观察值的平均值,这些观察结果不是= NA,这应该给你你想要的

        【讨论】:

        • 不确定您在说什么 akrun...我复制了原始帖子并对其进行了编辑,然后注意到我修复了两个语法错误,但是您的帖子在我写作时出现了,直到我才看到我拿到这张纸条就去看了……这不是一个原始的想法,两个人不会同时得到它……最终的答案是不同的……数据框结构很漂亮一开始的常见错误。
        • 好的,没问题。我之前注意到你的帖子是"pollutant"
        【解决方案4】:

        以上所有答案都帮助我解决了问题。

         mean(df[[pollutant]], na.rm = TRUE)
        

        最终返回正确答案。谢谢!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多