如果一天中两小时之间的数据符合标准,那么一天的子集数据?

时间:2011-07-05 11:51:48

标签: r subset days hour

我是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 个答案:

答案 0 :(得分:1)

试试这个:

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)

答案 1 :(得分:1)

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会将所有组合并到一个结果数据框中。