【问题标题】:Calculate the mean of one column from several CSV files从多个 CSV 文件中计算一列的平均值
【发布时间】:2014-05-30 16:36:13
【问题描述】:

我在一个文件夹中有 300 多个 CSV 文件(名为 001.csv、002.csv 等)。每个都包含一个带有标题的数据帧。我正在编写一个函数,它将接受三个参数:文件的位置、要计算平均值的列的名称(在数据框内)以及要在计算中使用的文件。

这是我的功能:

pollutantmean2 <- function(directory = getwd(), pollutant, id = 1:332) {

    # add one or two zeros to ID so that they match the CSV file names
    filenames <- sprintf("%03d.csv", id)

    # path to specdata folder
    # if no path is provided, default is working directory
    filedir <- file.path(directory, filenames)

    # get the data from selected ID or IDs from the specified path
    dataset <- read.csv(filedir, header = TRUE)

    # calculate mean removing all NAs
    polmean <- mean(dataset$pollutant, na.rm = TRUE)

    # return mean
    polmean

}

我的代码似乎有两处错误。为了将其分解,我将函数分成两个单独的函数来处理这两个任务:1)获取所需的文件和 2)计算所需列的平均值(又名 pollutant)。

任务 1: 获取适当的文件 - 只要我只需要一个文件,它就可以工作。如果我选择一系列文件,例如1:25,我会收到一条错误消息,上面写着Error in file(file, "rt") : invalid 'description' argument。我已经用谷歌搜索了这个错误,但仍然不知道如何修复它。

# function that obtains csv files and stores them
getfile <- function(directory = getwd(), id) {
    filenames <- sprintf("%03d.csv", id)
    filedir <- file.path(directory, filenames)
    dataset <- read.csv(filedir, header = TRUE)
    dataset
}

如果我运行getfile("specdata", 1),它可以正常工作,但如果我运行getfile("specdata", 1:10),我会收到以下错误:Error in file(file, "rt") : invalid 'description' argument

任务 2: 计算指定命名列的平均值 - 假设我有一个可用的数据框,然后我尝试使用以下函数计算平均值:

calcMean <- function(dataset, pollutant) {
    polmean <- mean(dataset$pollutant, na.rm = TRUE)
    polmean
}

但是,如果我运行 calcMean(mydata, "sulfate")(其中 mydata 是我手动加载的数据框),我会收到一条错误消息: Warning message: In mean.default(dataset$pollutant, na.rm = TRUE) : argument is not numeric or logical: returning NA

奇怪的是,如果我在控制台中运行mean(mydata$sulfate, na.rm = TRUE),它可以正常工作。

我已经研究了几天,经过无休止的调整,我已经没有想法了。

【问题讨论】:

  • 如果pollutant 是变量的名称,您可能需要dataset[[pollutant]] 而不是dataset$pollutant
  • read.csv 将一个 csv 文件作为参数,而不是文件列表(这就是 getfiles("specdata", 1) 起作用的原因)。您可以循环调用 getfile 或使用 lapply。
  • 这是 coursera 课程“R 编程”中使用的作业。它应该从页面中删除。

标签: r csv


【解决方案1】:

您不需要更多功能。根据我的理解,解决方案可以更简单 6 行:

pollutantmean <- function(directory, pollutant, id = 1:10) {
filenames <- sprintf("%03d.csv", id)
filenames <- paste(directory, filenames, sep="/")
ldf <- lapply(filenames, read.csv)
df=ldply(ldf)
# df is your list of data.frames
mean(df[, pollutant], na.rm = TRUE)
}

【讨论】:

【解决方案2】:

我认为您的主要问题是列出工作目录中的文件并将它们读入 R。尝试 R 示例代码中的 list.files 函数可能对您有用是

  files <- list.files(pattern = ".csv") ## creates a vector with all file names in your folder
polmean <- rep(0,length(files))
for(i in 1:length(files)){
   data <- read.csv(files[i],header=T)
   polmean[i] <- mean(data$pollutant)
 }
result <- cbind(files,polmean)
write.csv(result,"result_polmeans.csv")

该程序在第一列中为您提供文件名的数据,在第二列中提供相应的方法。

【讨论】:

  • 感谢您的帮助。我在这段代码中看到的唯一问题(如果我理解正确的话)是它将加载所有文件。我需要该功能允许用户定义他/她想要加载的单个文件或一系列文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2015-01-08
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多