我是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)
非常感谢你的帮助, 凯蒂
答案 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
会将所有组合并到一个结果数据框中。