【发布时间】:2015-05-28 15:06:59
【问题描述】:
我有一个数据表(处理我拥有的所有记录的速度要快得多),我想根据某个组的某些行满足的条件来标记行。我会尽力说明。我的数据如下所示:
ID DATE EVENT
1 01-Jan-97 A
1 01-Jan-97 K
2 03-Jan-03 A
3 04-Jan-03 K
所以有一个 ID、一个日期和一个事件。最终目标是如果同一日期已经存在 EVENT=K,则删除具有 EVENT=A 的行。所以我考虑设置两个标志,一个如果组(ID,DATE)有A,另一个如果他们有K,那么,如果它有两个标志=1,我会删除包含A的行,因为我不需要它。
所以,获得前两个标志就可以了。代码是这样的:
mydata.table[EVENT=="K", k.flag:=1, by=.(ID, DATE)]
我对 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
然后我只删除=1 和EVENT=A。我知道这不是一个非常优雅的解决方案,但它是我能想到的最好的解决方案,但我对第三个标志的声明有疑问。有什么建议么?我认为这就像在 data.table 中有一个 CASE 语句,但我无法弄清楚......
谢谢!
【问题讨论】:
-
by似乎不需要创建该标志。也许您的意思是在某处使用any? -
我知道这是一个与 data.table 相关的问题,但如果有人想要,这里是 dplyr 方式:
dt %>% group_by(DATE) %>% filter(EVENT == "K" | !all(c("A", "K") %in% EVENT)) -
我想我过分简化了这个例子,但我的数据确实需要“by”...我认为我真正需要的是与“all”和“any”的某种组合,正如我在对下面的答案发表评论......无论如何,谢谢!
标签: r data.table