具有多个变化条件的行的总和R data.table

问题描述 投票:0回答:3

我正在尝试在具有两个条件的data.framedata.table中创建一列。与我看到的帖子不同,我尝试在下面进行修改,不同之处在于我没有条件的“值”,但条件取决于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年以上,则我不想将其包括在内。我以为我可以做一个指标变量的总和(如果受试者在一年中经历过这一事件,则设置为1),同时沿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)

现在的问题是我无法同时满足两个条件。我所看过的帖子似乎都知道要细分的特定值(例如R data.table subsetting on multiple conditions.),但是在我的情况下,该值在观察之间变化(不确定是否需要做一些循环?)。 >

我认为我需要一些类似的东西:

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

仅使用一种条件

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

提供了全部经验,所以我认为Year < Year条件有问题。

虽然我不太确定。我也尝试修改以下建议:how to cumulatively add values in one vector in R再没有运气,我指定条件的方式似乎出了问题。

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

任何帮助或指针,将不胜感激!

我正在尝试在具有两个条件的data.frame或data.table中创建一列。我看到的帖子和下面尝试修改的帖子的不同之处在于,我对...

r sum data.table multiple-conditions
3个回答
2
投票

这里是使用rollapplydata.table的方法


3
投票

这里是使用data.table的一种更多roll方法。


2
投票

使用data.table,我认为您正在寻找的语法应该是这样的:

© www.soinside.com 2019 - 2024. All rights reserved.