我是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
}
我的代码似乎有两个问题。为了分解它,我将函数分成两个独立的函数来处理两个任务: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
}
如果我运行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)
,它可以正常工作。
我将非常感谢任何有助于我指明正确方向的帮助。我已经研究了好几天,经过无休止的调整后,我已经没想完了。
答案 0 :(得分: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)
}
答案 1 :(得分: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")
该程序为您提供第一列中文件名和第二列中相应方法的数据。