我有一个数据表(可以更快地处理我拥有的所有记录),并且我想根据组中某些行满足的条件来标记行。我会尝试说明。我的数据如下所示:
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语句,但我无法弄清楚...
谢谢!
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)