Цикл агрегации данных в R - PullRequest
       15

Цикл агрегации данных в R

1 голос
/ 19 сентября 2011

У меня проблема с объединением моих данных в ежедневные данные.У меня есть фрейм данных, где NA были удалены (ссылка на изображение данных приведена ниже).Данные собирались 3 раза в день, но иногда из-за NA, есть только 1 или 2 записи в день;в некоторые дни данные полностью отсутствуют.

Теперь меня интересует , вычисляющее среднее дневное значение "dist" : это означает суммирование данных "dist" за один день и деление их наколичество записей в день (т. е. 3, если в этот день отсутствуют данные).Я хотел бы сделать это через цикл.Как я могу сделать это с помощью цикла?Проблема в том, что иногда у меня есть 3 записи в день, а иногда только 2 или даже 1. Я хотел бы сказать R, что для каждого дня , это должно суммировать "dist" и разделите его на количество записей , доступных на каждый день.

Я просто не знаю, как сформулировать цикл for для этой цели.Буду очень признателен, если вы дадите мне какой-нибудь совет по этой проблеме.Спасибо за ваши усилия и всего наилучшего,

Ян

Фрейм данных: http://www.pic -upload.de / view-11435581 / Data_loop.jpg.html

Редактировать: я использовал агрегат и tapply, как и предлагалось, однако среднее значение данных на самом деле не рассчитывалось:

              Group.1         x
1  2006-10-06 12:00:00  636.5395
2  2006-10-06 20:00:00  859.0109
3  2006-10-07 04:00:00  301.8548
4  2006-10-07 12:00:00  649.3357
5  2006-10-07 20:00:00  944.8272
6  2006-10-08 04:00:00  136.7393
7  2006-10-08 12:00:00  360.9560
8  2006-10-08 20:00:00       NaN

Используемый код:

dates<-Dis_sub$date
distance<-Dis_sub$dist
aggregate(distance,list(dates),mean,na.rm=TRUE)
tapply(distance,dates,mean,na.rm=TRUE)

Ответы [ 3 ]

6 голосов
/ 19 сентября 2011

Не используйте цикл.Используйте R. Некоторые примеры данных:

dates <- rep(seq(as.Date("2001-01-05"),
                 as.Date("2001-01-20"),
                 by="day"),
             each=3)
values <- rep(1:16,each=3)
values[c(4,5,6,10,14,15,30)] <- NA

и любое из:

aggregate(values,list(dates),mean,na.rm=TRUE)

tapply(values,dates,mean,na.rm=TRUE)

дает вам то, что вы хотите.См. Также ?aggregate и ?tapply.

Если вы хотите вернуть кадр данных, вы можете посмотреть на пакет plyr:

Data <- as.data.frame(dates,values)
require(plyr)

ddply(data,"dates",mean,na.rm=TRUE)

Имейте в виду, что ddplyне полностью поддерживает формат даты (пока).

2 голосов
/ 19 сентября 2011

Посмотрите на пакет data.table, особенно если ваши данные огромны.Вот некоторый код, который вычисляет среднее значение dist на day.

library(data.table)
dt = data.table(Data)
Data[,list(avg_dist = mean(dist, na.rm = T)),'date']
1 голос
/ 19 сентября 2011

Похоже, ваша главная проблема в том, что ваше поле date имеет привязанные времена. Первое, что вам нужно сделать, это создать столбец, содержащий только дату, используя что-то вроде

Dis_sub$date_only <- as.Date(Dis_sub$date)

Тогда сработает решение Joris Meys (что является правильным способом сделать это).

Однако, если по какой-то причине вы действительно хотите использовать цикл, вы можете попробовать что-то вроде

newFrame <- data.frame()
for d in unique(Dis_sub$date){
    meanDist <- mean(Dis_sub$dist[Dis_sub$date==d],na.rm=TRUE)
    newFrame <- rbind(newFrame,c(d,meanDist))
}

Но имейте в виду, что это будет медленно и неэффективно для памяти.

...