данные подмножества за день, если данные между двумя часами дня соответствуют критериям?

Я новичок в R, и было бы здорово, если бы вы могли помочь с этой проблемой, поскольку я не смог найти ответы на эту проблему в Интернете. Это часть моего фрейма данных (DF) (в этом формате он продолжается до 2008 года)

Counter Date    Hour    counts
1245    26/05/2006  0   1
1245    26/05/2006  100 0
1245    26/05/2006  200 2
1245    26/05/2006  300 0
1245    26/05/2006  400 5
1245    26/05/2006  500 3
1245    26/05/2006  600 9
1245    26/05/2006  700 10
1245    26/05/2006  800 15

Вот мой вопрос: мне нужно подмножить свой код так, чтобы между 6:00 и 22:00, если количество часов больше 0, мне нужно было сохранить весь день (0:00-23:00) в наборе данных. , но если в указанный период времени (с 600 до 2200) нет отсчетов, то нужно удалить весь день. Как я могу это сделать?

Я попытался сделать это с помощью следующего фрагмента кода, хотя он требует ТОЛЬКО данных подсчета между 600 и 2200 часами, и я не могу понять, как заставить его работать целый день.

DF2=DF[(DF$hour>=600)&(DF$hour<=2200)&(DF$counts>0),] ##16hr worth of counts from 600 to 2200

Затем я подмножаю данные, в которых почасовые подсчеты объединяются в ежедневные подсчеты, используя следующий код.

daily=subset(DF2)
    daily$date = as.Date(daily$date, "%m/%d/%Y") 
    agg=aggregate(counts~ date, daily, sum)
town=merge(agg,DF2$counter,all=TRUE) 

Большое спасибо за вашу помощь заранее, Кэти


person Katie_S    schedule 05.07.2011    source источник


Ответы (2)


Попробуй это:

TDF <- subset(DF, hour>=600 & hour<=2200)
# get dates where there at least one hour with count data in range
dates <- subset(aggregate(counts~Date,TDF,sum),counts>0)$Date
# get dates where there are no hours with zero count
dates2 <- subset(aggregate(counts~Date,TDF,prod),counts>0)$Date

DF2 <- subset(DF,Date %in% dates)
DF3 <- subset(DF,Date %in% dates2)
person James    schedule 05.07.2011
comment
Спасибо за ваш быстрый ответ @James. Он отлично работает для дней, когда >0 между 600 и 2200. Если бы я хотел изменить код так, чтобы те дни, для которых есть по крайней мере почасовые данные подсчета для КАЖДОГО часа между 600 и 2200 (то есть, если есть 0 подсчетов в 900 это будет означать, что день не включен в подмножество), есть ли к этому простое дополнение? Еще раз большое спасибо за вашу помощь! - person Katie_S; 05.07.2011
comment
@Katie_S Да, просто используйте prod вместо sum в статусе aggregate. Я обновлю ответ. - person James; 05.07.2011

Plyr твой друг :)

install.packages(plyr)
library(plyr)

ddply(DF, .(Date), function(day) {
   if (sum(day$hour >=600 & day$hour <= 2200) > 0) day
   else subset(day, hour == -1)
})

ddply сгруппирует записи в DF по Date, затем для каждой группы, если есть запись с часом между 6000 и 2200, вернет этот день; в противном случае вернуть пустой фрейм данных. Затем ddply объединит все группы в результирующий фрейм данных.

person rafalotufo    schedule 05.07.2011
comment
Спасибо за ваш ответ @rafalotufo, я получаю это сообщение, когда пытаюсь использовать plyr «Ошибка в .fun(piece, ...): объект« Час »не найден». кадр данных. - person Katie_S; 05.07.2011
comment
Спасибо @rafalotufo, поиграв с этим, я понял, что проблема в этом. - person Katie_S; 07.07.2011