0

data.frameまたはdata.table2 つの条件で列を作成しようとしています。私が見た投稿と以下で変更しようとした投稿との違いは、条件の「値」を持っていないが、条件が の他の変数に依存することdata.frameです。

これが私のデータフレームであるとしましょう:

mydf <- data.frame (Year = c(2000, 2001, 2002, 2004, 2005,
                             2007, 2000, 2001, 2002, 2003,
                             2003, 2004, 2005, 2006, 2006, 2007),
                    Name = c("Tom", "Tom", "Tom", "Fred", "Gill",
                             "Fred", "Gill", "Gill", "Tom", "Tom",
                             "Fred", "Fred", "Gill", "Fred", "Gill", "Gill"))

3 人の被験者が過去 5 年間に何回イベントを経験したかを知りたいです。ただし、イベントの日付が 5 年以上前にさかのぼる場合は、含めたくありません。Year < Year & Year >= Year-5. _ したがって、基本的には、焦点年よりも小さく、焦点年より 5 年以上前の年の経験を合計します。

合計の指標と焦点年の変数を作成しました - 5

mydf$Ind <- 1
mydf$Yearm5 <- mydf$Year-5

次に、速度のためにデータ テーブルに変換します (元の df には +60k obs があります)。

library(data.table)
mydf <- data.table(mydf)

今の問題は、2 つの条件を機能させることができないということです。私が見た投稿はすべて、サブセット化する特定の値を知っているようです (たとえば、複数の条件での R data.table subsetting. )、しかし私の場合、値は観測ごとに変化します (これが私がする必要があることを意味するかどうかはわかりません)いくつかのループ?)。

次のようなものが必要だと思いました:

mydf[, c("Exp"):= sum(Ind), by = c("Name")][Year < Year & Year >= Yearm5]

与えます:

Empty data.table (0 rows) of 5 cols: Year,Name,Ind,Yearm5,Exp

条件を 1 つだけ使用する

mydf1 <- mydf[, c("Exp"):= sum(Ind), by = c("Name")][Year >= Yearm5] 

全体的な経験を与えるので、状態に何か問題があると想定していYear < Yearます。

よくわかりませんが。また、提案を変更しようとしました: R の 1 つのベクトルに値を累積的に追加する 方法は、条件を指定する方法に問題があるようです。

library(dplyr)
mytest1 <- mydf %>%
           group_by(Name, Year) %>%
           filter(Year < Year & Year >= Yearm5) %>%
           mutate(Exp = sum(Ind))

結果は次のようになります。

myresult <- data.frame (Year = c(2003, 2004, 2004, 2006,
                                 2007, 2000, 2001, 2005,
                                 2005, 2006, 2007, 2000,
                                 2001, 2002, 2002, 2003),
                        Name = c("Fred", "Fred", "Fred", "Fred",
                                 "Fred", "Gill", "Gill", "Gill",
                                 "Gill", "Gill", "Gill", "Tom",
                                 "Tom", "Tom", "Tom", "Tom"),
                        Ind = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                        Exp = c(0, 1, 1, 3, 4, 0, 1, 1, 1, 2, 3, 0, 1, 2, 2, 4),
                        Yearm5 = c(1998, 1999, 1999, 2001, 2002,
                                   1995, 1996, 2000, 2000, 2001,
                                   2002, 1995, 1996, 1996, 1997, 1998))

ヘルプやポインタをいただければ幸いです。

4

3 に答える 3

2

を使用data.tableすると、探している構文は次のようになるはずです。

setDT(mydf)
mydf[ , Exp := rank(x=Year,ties.method="min")-1, by=Name]
于 2014-08-07T01:22:21.060 に答える
2

rollapply とを使用したアプローチを次に示します。data.table

library(zoo)
 setDT(mydf)
 setkey(mydf, Name,Year)
 # create a data.table that has all Years and incidences including the 5 year window 
 # and sum up the number of incidences per year for each subject 
m <- mydf[CJ(unique(Name),seq(min(Year)-5, max(Year))),allow.cartesian=TRUE][,
            list(Ind = unique(Ind), I2 = sum(Ind,na.rm=TRUE)),
            keyby=list(Name,Year)]
# use rollapply over this larger data.table to get the number of
# incidences in the previous 5 years (not including this year (hence head(x,-1))
m[,Exp := rollapply(I2, 5, function(x) sum(head(x,-1)), 
                    align = 'right', fill=0),by=Name]
# join with the original to create your required data
m[mydf, !'I2']
   Name Year Ind Exp
#  1: Fred 2003   1   0
#  2: Fred 2004   1   1
#  3: Fred 2004   1   1
#  4: Fred 2006   1   3
#  5: Fred 2007   1   4
#  6: Gill 2000   1   0
#  7: Gill 2001   1   1
#  8: Gill 2005   1   1
#  9: Gill 2005   1   1
# 10: Gill 2006   1   2
# 11: Gill 2007   1   3
# 12:  Tom 2000   1   0
# 13:  Tom 2001   1   1
# 14:  Tom 2002   1   2
# 15:  Tom 2002   1   2
# 16:  Tom 2003   1   4
于 2014-08-07T04:57:34.427 に答える