3

というか、どうすれば私が考えていたよりもうまくやれるのでしょうか。

グループ内に名前と開始日と終了日を含むデータフレームがあります。時間の経過とともにグループ内の人数を含むデータフレームを作成したいと思います。まだ去っていない人もいることに注意してください(終了日はNAです)

これがサンプルデータセットです

foo<-data.frame(name=c("Bob","Sue", "Richard", "Jane"), 
        Start=as.POSIXct(c("2006-03-23 GMT", "2007-01-20 GMT", "2007-01-20 GMT", "2006-03-23 GMT")),
        End=as.POSIXct(c("2009-01-20 GMT", "NA", "2006-03-23 GMT", "NA")))

ここでは、必要な範囲をカバーする日付のデータフレームを作成します。これはとても汚い感じがします。

daterange<-data.frame(date=as.POSIXct(
                paste(
                        rep(2006:2009, each=12), 
                        "-", 
                        rep(01:12, times=4),
                        "-", 
                        1,
                        " GMT", 
                        sep="")
                        )
                )

#cheat by setting NAs to soemthing far away
foo$End[is.na(foo$End)]<-as.POSIXct(Sys.time())+(365*24*60*60)

ここで、ddplyを使用して結果を生成します。

ddply(.data=daterange, .variable="date", function(df) {
            result=nrow(subset(foo, Start<df$date & End>df$date))
            return(result)
        })

もっと簡単な方法があるはずですか?

4

2 に答える 2

3

を使用した別のアプローチを次に示しplyrます。元のデータ フレームを直接操作し、日付にfoo変換する必要はありません。NAコードは一目瞭然で、非常に読みやすいです。どんなコメントでも大歓迎です。

dates = seq(as.POSIXct('2006-01-01'), as.POSIXct('2009-12-01'), by = "month")
count = ldply(dates, function(d) 
   with(foo, sum((Start < d) + (d < End | is.na(End)) == 2)))
data.frame(dates, count)
于 2011-07-02T12:17:51.260 に答える
2

これがあなたがより簡単に見つけるかもしれない別の方法です:

foo<-data.frame(name=c("Bob","Sue", "Richard", "Jane"), 
    Start=as.POSIXct(c("2006-03-23 GMT", "2007-01-20 GMT", "2007-01-20 GMT", "2006-03-23 GMT")),
    End=as.POSIXct(c("2009-01-20 GMT", NA, "2006-03-23 GMT", NA)))


tmp <- expand.grid(foo$name,seq.POSIXt(as.POSIXct('2006-01-01'),
               as.POSIXct('2009-12-01'),by="month"))
colnames(tmp) <- c('name','date')
foo[is.na(foo)] <- max(tmp$date) + 1

tmp1 <- merge(tmp,foo,by="name")
tmp2 <- tmp1$Start <= tmp1$date & tmp1$End >= tmp1$date
aggregate(tmp2,by=list(date=tmp1$date),sum)

ここでの私の2セントは、日付を一緒に使用するのseq.*ではなく使用するためのものであり、実際に一度に1つの要素だけ日付範囲を取得する場合は、これは一種の厄介なツールです。私は使用しましたが、あなたはそのようなものを使用することができたでしょう。pasteddplyaggregatelapply

本当に必要な場合は、これをより少ない行に圧縮できますが、読みやすさが低下します。

于 2011-07-01T16:07:24.473 に答える