如果某些行满足条件,则使用R中的数据表标记组中的所有行

Fab*_*dez 4 r data.table

我有一个数据表(可以更快地处理我拥有的所有记录),并且我想根据组中某些行满足的条件来标记行。我会尝试说明。我的数据如下所示:

ID  DATE    EVENT
1   01-Jan-97   A
1   01-Jan-97   K
2   03-Jan-03   A
3   04-Jan-03   K
Run Code Online (Sandbox Code Playgroud)

因此,有一个ID,一个日期和一个事件。最终目的是,如果同一日期已经有EVENT = K,则删除具有EVENT = A的行。因此,我考虑设置两个标志,如果组(ID,DATE)具有A,则另一个标志,如果它们具有K,则设置两个标志,因此,如果它同时具有两个标志= 1,我将删除包含A的行,因为我不需要它。

因此,获得前两个标志是可以的。代码如下所示:

mydata.table[EVENT=="K", k.flag:=1, by=.(ID, DATE)] 
Run Code Online (Sandbox Code Playgroud)

我对A.flag也这样做。然后我不知道如何获取第三个标志来标记它是否同时具有,那么我可以使用A删除记录。所以我想要一个类似表的内容:

ID  DATE    EVENT   K.FLAG  A.FLAG  BOTH
1   01-Jan-97   A      0       1    1
1   01-Jan-97   K      1       0    1
2   03-Jan-03   A      0       1    0
3   04-Jan-03   K      1       0    0
Run Code Online (Sandbox Code Playgroud)

然后我将同时删除= 1和EVENT = A。我知道这不是一个非常优雅的解决方案,但这是我能想到的最好的解决方案,但是我对第三个标志的声明有疑问。有什么建议么?我认为这就像在data.table中使用CASE语句,但我无法弄清楚...

谢谢!

edd*_*ddi 5

dt[, flag := all(c('A', 'K') %in% EVENT), by = DATE]
dt
#   ID      DATE EVENT  flag
#1:  1 01-Jan-97     A  TRUE
#2:  1 01-Jan-97     K  TRUE
#3:  2 03-Jan-03     A FALSE
#4:  3 04-Jan-03     K FALSE
Run Code Online (Sandbox Code Playgroud)