R - 均值始终返回0

时间:2017-03-19 13:26:10

标签: r for-loop dataframe mean rbind

我的目标是创建一个函数,从工作目录中读取指定的.csv文件(所有文件都具有相同的格式),将它们绑定到一个数据框中,然后返回指定列的平均值(&#34)该数据框的硝酸盐"或硫酸盐#34;)。目前的问题是每次我调用函数时,无论我选择读取多少文件/计算平均值的行数,该函数总是返回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",]))
}

4 个答案:

答案 0 :(得分:2)

如果您需要均值,并且数据使用中存在NAmean(df["pollutant",], na.rm = TRUE)

您正在计算出现NA个的比率。如果你回来0,则意味着你只有NA。所以也许还有其他错误。也许您可以在数据框架上使用dput(),以便我们查看。

答案 1 :(得分:0)

语法错误。它应该是

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]]))
  }

答案 2 :(得分:0)

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

通常,变量保存在列中,单个观察值保存在行中。因此,移动该逗号有助于将正确的数据输入到您的计算中,为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,这应该可以为您提供所需内容

答案 3 :(得分:0)

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

yourSearchBarVariable.keyboardAppearance = .dark

最终回复了正确的答案。谢谢!