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を超えるカウントがある場合は、データセットに1日(000から2300)を保持する必要がありますが、カウントがない場合は、コードをサブセット化する必要があります指定された期間(600〜2200)で、1日を削除する必要があります。これどうやってするの?

次のコードでこれを実行しようとしましたが、600〜2200時間のカウントデータしか必要とせず、1日かかるようにする方法がわかりません。

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

これを試して:

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 に答える
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次に、すべてのグループを組み合わせて結果のデータフレームにします。

于 2011-07-05T14:24:03.323 に答える