【问题标题】:Flag all rows in a group using data table in R if some rows meet a condition如果某些行满足条件,则使用 R 中的数据表标记组中的所有行
【发布时间】: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


【解决方案1】:
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

【讨论】:

  • 简单优雅,速度惊人!谢谢!没有考虑“全部”功能。我会接受我给出的例子的答案,因为它是完美的,但我能问你如果你有例如 A1、A2、K1、K2 并且如果有任何 K 存在,那么我会用真的?全部(任何(A1,A2),任何(K1,K2)),也许?
  • 是的,这样的东西应该可以工作,iiuc:any(c('A1', 'A2') %in% EVENT) && any(c('K1', 'K2') %in% EVENT)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多