Использовать имя файла для усреднения данных по месяцам

У меня есть вопрос, связанный с R, который связан с необходимостью чтения многих файлов и обработки этих файлов. Каждый файл предназначен для измерений озона, сделанных в разное время на разных станциях. Данные в формате таблицы, и я могу прочитать данные, используя:

files <- list.files()
data  <- lapply(files, read.table, skip=19)

Это дает мне кадр данных для всех файлов, которые я хотел бы сейчас обработать. Например, файлы называются:

> head(files)
 [1] "fiji_19980105.dat" "fiji_19980112.dat" "fiji_19980119.dat"
 [4] "fiji_19980130.dat" "fiji_19980206.dat" "fiji_19980213.dat"

Где «фиджи» — название станции, а дата — в формате YMD. Я хотел бы усреднить кадр данных, чтобы получить среднемесячные значения для этой станции (мне нужно будет работать только с одной станцией за раз, поэтому на самом деле я просто хочу усреднить кадр данных, называемый данными, для получения 12 наборов средних данных).

Я думаю, что могу сделать это, используя некоторую функцию ?apply, но я действительно не понимаю, как это сделать. Любые предложения по решению действительно ценятся!

В качестве примера результата добавления дат во фрейм данных мы имеем:

> head(dat)
V1     V2    V3   V4 V5   V6    V7   V8   V9  V10       Date
1 9000 1007.7 0.006 29.6 74 0.59 0.006 9000 9000 9000 1998-01-05
2 9000 1005.2 0.028 29.3 75 0.62 0.006 9000 9000 9000 1998-01-05
3 9000 1001.6 0.060 28.5 78 0.63 0.006 9000 9000 9000 1998-01-05

 > str(dat)
'data.frame':   153994 obs. of  11 variables:
 $ V1  : int  9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 ...
 $ V2  : num  1008 1005 1002 997 993 ...
 $ V3  : num  0.006 0.028 0.06 0.104 0.14 0.169 0.198 0.238 0.271 0.301 ...
 $ V4  : num  29.6 29.3 28.5 27.9 27.6 27.2 27 26.6 26.2 26 ...
 $ V5  : int  74 75 78 79 80 81 82 84 85 85 ...
 $ V6  : num  0.59 0.62 0.63 0.68 0.69 0.7 0.72 0.74 0.75 0.76 ...
 $ V7  : num  0.006 0.006 0.006 0.007 0.007 0.007 0.007 0.008 0.008 0.008 ...
 $ V8  : num  9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 ...
 $ V9  : num  9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 ...
 $ V10 : num  9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 ...
 $ Date: Date, format: "1998-01-05" "1998-01-05" ...

person Alex Archibald    schedule 16.05.2012    source источник
comment
Итак, вам нужны средние значения для каждого столбца? агрегировать, а не постукивать, а затем   -  person mdsumner    schedule 16.05.2012


Ответы (1)


С вашим списком файлов получите Dates:

datetimes = as.Date(files, "fiji_%Y%m%d")

См. ?strptime для получения подробной информации о шаблонах формата, по сути, вы можете включать любые другие значения в качестве литерала-заполнителя и игнорировать любые завершающие символы, которые не имеют значения.

Остальное требует, чтобы вы предоставили больше информации о том, что находится в каждом data.frame, поэтому дайте нам больше информации о данных в них.

Было бы лучше создать один большой data.frame с этими отметками даты, добавленными в каждую строку, а затем перейти оттуда.

Чтобы что-то подобное работало (представьте, что это называется «dat», а не «data»):

dat = lapply(files, read.table, skip=19)

for (i in 1:length(files)) {
    dat[[i]]$Date = rep(datetimes[i], nrow(dat[[i]])

}

dat = do.call("rbind", dat)

Затем вы можете использовать format(dat$Date, "%m"), чтобы получить значение для каждой даты, которое включает только месяц, и tapply для этого с функцией суммирования (например, mean). Будут менее классические plyr версии этого, которые, без сомнения, скоро появятся. :)

Вероятно, не стоит вызывать read.table с помощью lapply, поэтому я бы также изменил это, чтобы вы могли выполнять базовые проверки для каждого ввода-вывода и слияния data.frames.

person mdsumner    schedule 16.05.2012
comment
Спасибо! Я только что написал что-то странное (используя 4 переменные tmp и множество несписков), чтобы получить результат для даты и времени! Я не знал, что Р такой умный :) - person Alex Archibald; 16.05.2012
comment
спасибо за пример. Боюсь, я застрял на вашем предложении использовать tapply, поскольку я не совсем понимаю, как это работает. Каждый файл потенциально может иметь разную длину. Вторая переменная — это давление, третья — высота, а данные поступают от воздушных шаров, запускаемых в небо (зависит от взрыва на разных высотах). В конце я хотел бы создать либо фрейм данных, либо список списков (не уверен, каковы плюсы и минусы?), которые содержат среднее давление, высоты и озон (V2, V3 и V7) за январь-декабрь. . Спасибо за вашу помощь! - person Alex Archibald; 16.05.2012
comment
разная длина подойдет, для этого и нужен tapply - person mdsumner; 16.05.2012