Я беру вводный курс R-программирования на Cousera. В первом задании мы оцениваем список сотен файлов csv в указанном каталоге («./specdata/). Каждый файл csv, в свою очередь, содержит сотни записей данных о загрязнителях образца в атмосфере - дату, образец сульфита , образец нитрата и идентификатор, который идентифицирует местоположение выборки.R для цикла - добавление результатов за пределы цикла
Уступка просит нас создать функцию, которая забирает загрязняющий элемент идентификатором или диапазоном идентификаторов для места выборки и возвращает среднее значение выборки, учитывая предоставленные аргументы .
Мой код (ниже) использует цикл, чтобы использовать идентификатор аргумента только читать файлы, представляющие интерес (кажется более эффективным, чем чтение всех 322 файлов, прежде чем делать какие-либо обработки). Это прекрасно работает.
Внутри цикла я присваиваю содержимое файла csv переменной. Затем я делаю эту переменную фреймом данных и использую rbind
, чтобы добавить к нему файл, считанный в течение каждого цикла. Я использую na.omit
для удаления отсутствующих файлов из переменной. Затем я использую rbind
, чтобы добавить результат каждой итерации цикла к переменной. Когда я печатаю переменную фрейма данных в цикле, я могу видеть весь полный список, подгруппированный по id. Но когда я печатаю переменную вне цикла, я вижу только последний элемент в векторе id.
Я хотел бы создать сводный список всех записей, соответствующих аргументу id в цикле, а затем передать список консоли за пределами цикла для дальнейшей обработки. Я не могу заставить это работать. Мой код показан ниже.
Это неправильный подход? Похоже, это может сработать. Любая помощь будет оценена по достоинству. Я искал StackOverflow и не мог найти ничего, что вполне соответствует тому, что я пытаюсь сделать.
pmean <- function(directory = "./specdata/", pollutant, id = 1:322) {
x <- list.files(path=directory, pattern="*.csv")
x <- paste(directory, x, sep="")
id1 <- id[1]
id2 <- id[length(id)]
for (i in id1:id2) {
df <- read.csv(x[i], header = TRUE)
df <- data.frame(df)
df <- na.omit(df)
df <- rbind(df)
print(df)
}
# would like a consolidated list of records here to to do more stuff, e.g. filter on pollutant and calcuate mean
}
[list.files] (http://www.inside-r.org/r-doc/base/list.files) имеет аргумент * full.names * (по умолчанию False), поэтому нет необходимости вставлять каталог. Также read.csv импортирует в фрейм данных, поэтому нет необходимости в строке 'data.frame()'. И 'na.omit()' может быть избыточным, поскольку 'list.files' выбирает все не пропускаемые файлы из указанного пути. Если вы имеете в виду пропустить пустые строки, [read.table] (http://www.inside-r.org/r-doc/utils/read.csv), то производная функция 'read.csv' имеет такой аргумент (по умолчанию к Истине). – Parfait