【问题标题】:Getting a conditional maximum in data.table using .SD使用 .SD 在 data.table 中获得条件最大值
【发布时间】:2016-06-10 04:33:28
【问题描述】:

我一直在尝试这样做一段时间,但事实证明这非常困难,因此我不得不寻求您的宝贵帮助。

我的问题是我有一个包含三个主要阵营的向量:IDdatestate。由于有多个寄存器,ID 在 DB 中重复了多次。 date 只是注册完成的日期。 状态可以是“活动”或“非活动”。

我需要做以下事情:对于每个文档,我必须只取最近的一个,具有以下优先级:如果有一个“活动”寄存器,我必须取所有可能的“活动”寄存器中最近的一个,如果没有活动的我一般都得拍最近的。

例如,假设我有这个

data.table(ID=rep(seq(1,3),each=3),state=c("active","active","active","inactive","inactive","inactive","active","active","inactive"),Date=as.Date(c("2016-01-01","2016-01-03","2016-01-02","2016-01-04","2016-01-05","2016-01-06","2016-01-07","2016-01-08","2016-01-10")),value=seq(1,9))

ID state Date value 1: 1 active 2016-01-01 1 2: 1 active 2016-01-03 2 3: 1 active 2016-01-02 3 4: 2 inactive 2016-01-04 4 5: 2 inactive 2016-01-05 5 6: 2 inactive 2016-01-06 6 7: 3 active 2016-01-07 7 8: 3 active 2016-01-08 8 9: 3 inactive 2016-01-10 9

我一直在尝试做类似的操作:

dx[,list(if (length(.SD[state=="active"])==0) {.SD[which.max(Date)]} else {.SD[state=="active"] [which.max(Date)]}) ,by='ID']

所以我得到类似的东西:

ID state Date value 1: 1 active 2016-01-03 2 2: 2 inactive 2016-01-06 6 3: 3 active 2016-01-08 8

我想对 data.table 进行矢量化操作。如果你能帮助我,那就太棒了!

谢谢你, 阿尔多

【问题讨论】:

    标签: r data.table conditional aggregate


    【解决方案1】:

    我们可以使用对 OP 代码的修改来获得预期的输出。按“ID”分组,if“状态”中有any“活动”字符串,我们得到“状态”为“活动”的最大“日期”的索引(使用which.max)和对 Data.table (.SD[which.max...) 或 else 设置子集,我们得到最大的“日期”索引 (which.max(Date)),然后使用 .SD

     dx[,if(any(state=='active')) .SD[which.max(Date[state=='active'])] 
                else .SD[which.max(Date)], ID]
     #    ID    state       Date value
     #1:  1   active 2016-01-03     2
     #2:  2 inactive 2016-01-06     6
     #3:  3   active 2016-01-08     8
    

    或者另一种选择是 order 'Date' 和 'state' 列并通过 'ID' 选择第一个观察结果

    dx[order(ID,state, -Date),.SD[1L], ID]
    #   ID    state       Date value
    #1:  1   active 2016-01-03     2
    #2:  2 inactive 2016-01-06     6
    #3:  3   active 2016-01-08     8
    

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2012-05-21
      相关资源
      最近更新 更多