1

我对 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) 

非常感谢您提前提供的帮助,凯蒂

4

2 回答 2

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将按 分组条目DFDate然后对于每个组,如果有一个小时在 6000 和 2200 之间的条目,则返回当天;否则返回一个空数据框。ddply然后将所有组组合成一个结果数据框。

于 2011-07-05T14:24:03.323 回答
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)
于 2011-07-05T12:01:19.867 回答