从R中的几个CSV文件计算一列的平均值

han*_*kqw -22 csv r

我是R.的新手.我在一个文件夹中有超过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

}
Run Code Online (Sandbox Code Playgroud)

看来我的代码有两个问题.为了分解它,我将函数分成两个独立的函数来处理两个任务:1)获取所需的文件和2)计算所需列的平均值(aka pollutant).

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

# function that gets 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
}
Run Code Online (Sandbox Code Playgroud)

如果我运行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
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行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)在控制台中运行,它运行正常.

我将不胜感激,这些帮助将指引我朝着正确的方向前进.我已经研究了好几天,经过无休止的调整后,我已经没想完了.

小智 11

您不需要更多功能.根据我对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)
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是ldply?我不知道那个功能. (3认同)