使用.SD获取data.table中的条件最大值

时间:2016-02-26 19:54:52

标签: r data.table conditional aggregate

我一直试图这样做一段时间,但事实证明这很难,所以我不得不向你寻求宝贵的帮助。

我的问题是我有一个有三个主要阵营的向量: ID 日期。由于有多个寄存器, ID 在DB中重复多次。 日期就是注册完成的日期。并且可能是“活跃的”'或者'不活跃'。

我需要执行以下操作:对于每个文档,我必须只使用具有以下优先级的最新文档:如果存在“活动”文件。注册我必须采取最新的可能' Active'那些,如果没有活动,我必须采取最新的一般。

例如,让我说我有这个

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进行矢量化操作。如果你能帮助我,那就太棒了!。

谢谢你, 醛

1 个答案:

答案 0 :(得分:2)

我们可以使用OP代码的修改来获得预期的输出。按“ID”分组,Microsoft.CSharp“州”中有if个“有效”字符串,我们得到“州”为“有效”的最大“日期”索引(使用{ {1}})和Subset Data.table(any)或which.max我们获得最大'日期'索引(.SD[which.max...),然后使用else

which.max(Date)

或另一种选择是.SD'日期'和'州'列,并按'ID'选择第一个观察

 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