0

私はいくつかの異なるサイトにガチョウの数のデータフレームを持っています。目的は、連続する冬の期間に、各サイトで9月から4月までの8か月すべてのガチョウの月間カウントを行うことでした。冬の期間は、9月から4月までの8か月と定義されています。

メソッドが計画どおりに実行された場合、データは次のようになります。

df <- data.frame(site=c(rep('site 1', 16), rep('site 2', 16), rep('site 3', 16)),
                   date=dmy(rep(c('01/09/2007', '02/10/2007', '02/11/2007', 
                              '02/12/2007', '02/01/2008',  '02/02/2008', '02/03/2008',  
                              '02/04/2008', '01/09/2008', '02/10/2008', '02/11/2008', 
                                  '02/12/2008', '02/01/2009',  '02/02/2009', '02/03/2009',  
                                  '02/04/2009'),3)),
                   count=sample(1:100, 48))

その結果、一部のサイトでは9月から4月の期間に8カウントすべてがカウントされますが、他の9月から4月の期間にはカウントされないという状況になりました。さらに、一部のサイトでは、9月から4月の期間に8カウントを達成できませんでした。これらのおもちゃのデータは、私の実際のデータのように見えます。

df <- df[-c(11:16, 36:48),]

9月から4月の期間に8つの連続したカウントの一部を形成しない行をデータフレームから削除する必要があります。おもちゃのデータを使用して、これは私が必要とするデータフレームです:

df <- df[-c(9:10, 27:29), ]

ddply()from packageを使用してさまざまなコマンドを試しましplyrたが、成功しませんでした。この問題の解決策はありますか?

4

1 に答える 1

3

私が考えることができる1つの方法は、日付から4か月を引いyearて、でグループ化できるようにすることです。mondate4か月を引いて対応する日付を取得するには、パッケージを使用することをお勧めします。月を引くときに直面する問題と、それを克服する方法については、こちらをご覧ください。

require(mondate)
df$grp <- mondate(df$date) - 4
df$year <- year(df$grp)
df$month <- month(df$date)
ddply(df, .(site, year), function(x) {
    if (all(c(1:4, 9:12) %in% x$month)) {
        return(x)
    } else {
        return(NULL)
    }
})

#      site       date count        grp year month
# 1  site 1 2007-09-01    87 2007-05-02 2007     9
# 2  site 1 2007-10-02    44 2007-06-02 2007    10
# 3  site 1 2007-11-02    50 2007-07-03 2007    11
# 4  site 1 2007-12-02    65 2007-08-02 2007    12
# 5  site 1 2008-01-02    12 2007-09-02 2007     1
# 6  site 1 2008-02-02     2 2007-10-03 2007     2
# 7  site 1 2008-03-02   100 2007-11-02 2007     3
# 8  site 1 2008-04-02    29 2007-12-03 2007     4
# 9  site 2 2007-09-01     3 2007-05-02 2007     9
# 10 site 2 2007-10-02    22 2007-06-02 2007    10
# 11 site 2 2007-11-02    56 2007-07-03 2007    11
# 12 site 2 2007-12-02     5 2007-08-02 2007    12
# 13 site 2 2008-01-02    40 2007-09-02 2007     1
# 14 site 2 2008-02-02    15 2007-10-03 2007     2
# 15 site 2 2008-03-02    10 2007-11-02 2007     3
# 16 site 2 2008-04-02    20 2007-12-03 2007     4
# 17 site 2 2008-09-01    93 2008-05-02 2008     9
# 18 site 2 2008-10-02    13 2008-06-02 2008    10
# 19 site 2 2008-11-02    58 2008-07-03 2008    11
# 20 site 2 2008-12-02    64 2008-08-02 2008    12
# 21 site 2 2009-01-02    92 2008-09-02 2008     1
# 22 site 2 2009-02-02    69 2008-10-03 2008     2
# 23 site 2 2009-03-02    89 2008-11-02 2008     3
# 24 site 2 2009-04-02    27 2008-12-03 2008     4

を使用した代替ソリューションdata.table

require(data.table)
require(mondate)
dt <- data.table(df)
dt[, `:=`(year=year(mondate(date)-4), month=month(date))]
dt.out <- dt[, .SD[rep(all(c(1:4,9:12) %in% month), .N)], 
           by=list(site,year)][, c("year", "month") := NULL]
于 2013-03-18T12:08:41.703 に答える