Вычислить среднее значение одного столбца из нескольких 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 }
Похоже, в моем коде есть две вещи. Чтобы разбить его, я разделил функцию на две отдельные функции, чтобы справиться с двумя задачами: 1) получить требуемые файлы и 2) рассчитать среднее значение требуемого столбца (aka pollutant
).
- Заказать бары в гистограмме ggplot2
- Указание colClasses в read.csv
- Найти имя файла из полного пути к файлу
- Ошибка в if / while (условие) {: отсутствует Значение, в котором требуется TRUE / FALSE
- Частичное совпадение аргумента функции
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)
, он отлично работает.
Я буду признателен за любую помощь, которая укажет мне в правильном направлении. Я исследовал это несколько дней и после бесконечной настройки, у меня закончилась идея.
- Как реализовать процедуру очистки в R Shiny?
- Разбиение строки на первом пространстве
- Прочитайте несколько файлов CSV в отдельных кадрах данных
- Как установить лимиты для осей в графиках ggplot2 R?
- Что такое эффективный метод разделения и агрегирования интервалов из временных строк в кадре данных?
- Затенение графика плотности ядра между двумя точками.
- Как эффективно внедряться в R
- Разбор JSON с R
Вам не нужно больше функций. Решение может быть проще из моего понимания в 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) }
Я думаю, что ваша главная проблема заключается в перечислении файлов в вашем рабочем каталоге и чтении их в R. Попробуйте функцию list.files в R Пример кода, который может работать для вас
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")
Эта программа дает вам данные с именем файла в первом столбце и соответствующими средствами во втором столбце.