Подмножество данных за день, если данные между двумя часами дня соответствуют критериям? - PullRequest
1 голос
/ 05 июля 2011

Я довольно новичок в 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

Это мой вопрос: Мне нужно поднастроить свой код так, чтобы междучасов 600 и 2200, если есть отсчеты более 0, то мне нужно сохранить весь день (от 000 до 2300) в наборе данных, но если в указанный период времени (от 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) 

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

Ответы [ 2 ]

1 голос
/ 05 июля 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 затем объединит все группы в результирующий фрейм данных.

1 голос
/ 05 июля 2011

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

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)
...