【问题标题】:How to cumulatively track unique combinations by group in R如何在R中按组累积跟踪唯一组合
【发布时间】:2018-06-11 18:44:14
【问题描述】:

我有与一个或多个 START/END 日期对相关联的唯一标识符的观察。这些观察在日期范围内按月按 ID 迭代。一个唯一 ID 和类别的示例,长度被截断。

  ID       START        END    MONTH CAT.A
10056 2004-01-08 2005-01-07 Jan 2004 
10056 2004-01-08 2005-01-07 Feb 2004 
10056 2004-01-08 2005-01-07 Mar 2004 
...
10056 2004-01-08 2005-01-07 Nov 2004 
10056 2004-01-08 2005-01-07 Dec 2004 
10056 2004-01-08 2005-01-07 Jan 2005 
--------------------------------------
10056 2006-11-28 2008-02-20 Nov 2006 
10056 2006-11-28 2008-02-20 Dec 2006 
10056 2006-11-28 2008-02-20 Jan 2007 
...
10056 2006-11-28 2008-02-20 Dec 2007 
10056 2006-11-28 2008-02-20 Jan 2008 
10056 2006-11-28 2008-02-20 Feb 2008 
--------------------------------------
10056 2010-01-30 2011-02-03 Jan 2010 
10056 2010-01-30 2011-02-03 Feb 2010 
10056 2010-01-30 2011-02-03 Mar 2010 
...
10056 2010-01-30 2011-02-03 Dec 2010 
10056 2010-01-30 2011-02-03 Jan 2011 
10056 2010-01-30 2011-02-03 Feb 2011 

我正在寻找的解决方案将累积计算CAT.A 的每个唯一事件发生。在第一个日期范围内,CAT.A 将是 1,在第二个日期范围内将 CAT.A 增加到 2,在第三个日期范围内增加到 3。此计数器对于此 ID 是唯一的,否则为 NA

  ID       START        END    MONTH CAT.A
10056 2004-01-08 2005-01-07 Jan 2004 1
10056 2004-01-08 2005-01-07 Feb 2004 1
10056 2004-01-08 2005-01-07 Mar 2004 1
...
10056 2004-01-08 2005-01-07 Nov 2004 1
10056 2004-01-08 2005-01-07 Dec 2004 1
10056 2004-01-08 2005-01-07 Jan 2005 1
--------------------------------------
10056 2006-11-28 2008-02-20 Nov 2006 2
10056 2006-11-28 2008-02-20 Dec 2006 2
10056 2006-11-28 2008-02-20 Jan 2007 2
...
10056 2006-11-28 2008-02-20 Dec 2007 2
10056 2006-11-28 2008-02-20 Jan 2008 2
10056 2006-11-28 2008-02-20 Feb 2008 2
--------------------------------------
10056 2010-01-30 2011-02-03 Jan 2010 3
10056 2010-01-30 2011-02-03 Feb 2010 3
10056 2010-01-30 2011-02-03 Mar 2010 3
...
10056 2010-01-30 2011-02-03 Dec 2010 3
10056 2010-01-30 2011-02-03 Jan 2011 3
10056 2010-01-30 2011-02-03 Feb 2011 3

该数据集有数百万个其他唯一 ID 和 11 个其他类别,但如果我能找到该子集的解决方案,我应该能够将其应用于整个数据集。

我找到了可以让我计算IDSTARTEND 的唯一组合总数的解决方案,但只有当 A 属于一个新的观察值时,它才有助于在每个观察中增加一次独特的START,END 事件。

我一直在使用 data.table 和 lubridate。

【问题讨论】:

  • 您实际尝试过使用 data.table 和 lubridate 做什么?您能否提供数据的代码示例/可重现版本?
  • @DavidKlotz 我只是提到了它,也许是无关紧要的,作为我在处理数据集时一直在使用的主要库,不一定针对这个问题。下面 Michael Ohlrogge 的答案应该有效。我可能已经盯着我的数据集很久了,以至于我没有考虑将其简化为如下所示的更简单的示例。明天我回到办公室并回复时我会试一试。

标签: r count data.table unique


【解决方案1】:

这个怎么样?

d = data.table(
    ID = c(rep(1,5), rep(2,5)),
    CAT = c(1,1,1,2,2,1,1,2,3,4)
    )

d[, N_Unique := cumsum(!duplicated(CAT)), by = ID]

> d
    ID CAT N_Unique
 1:  1   1        1
 2:  1   1        1
 3:  1   1        1
 4:  1   2        2
 5:  1   2        2
 6:  2   1        1
 7:  2   1        1
 8:  2   2        2
 9:  2   3        3
10:  2   4        4

如果您想要为每个 ID 值单独列(这似乎很奇怪,因为您有数百万个唯一值),您可以使用如下内容:

d[, ID := as.factor(ID)]
> cbind(d, diag(d[,N_Unique]) %*% model.matrix(~ ID - 1, d))
    ID CAT N_Unique ID1 ID2
 1:  1   1        1   1   0
 2:  1   1        1   1   0
 3:  1   1        1   1   0
 4:  1   2        2   2   0
 5:  1   2        2   2   0
 6:  2   1        1   0   1
 7:  2   1        1   0   1
 8:  2   2        2   0   2
 9:  2   3        3   0   3
10:  2   4        4   0   4

【讨论】:

  • d[, N_Unique := .SD[, rep(.GRP, .N), CAT], by = ID]。不过,使用 .GRP 会为在 ID 内未按 CAT 排序的数据集给出不同的答案。
  • @MichaelOhlrogge 您在顶部的解决方案帮助我使用d[!is.na(A),A_TOT:=cumsum(!duplicated(EVENT)),by=ID] 按类别获得最终输出,然后对其他类别重复。我必须通过在我的非迭代数据集上使用 rleid 创建EVENTc[,EVENT:=rleid(START),by=.(ID,CATEG)]
  • @DavidLee 太好了,很高兴听到这个消息。
猜你喜欢
  • 2022-08-22
  • 1970-01-01
  • 2022-11-29
  • 2014-01-03
  • 2013-03-19
  • 2021-09-14
  • 2021-10-15
  • 1970-01-01
  • 2021-06-18
相关资源
最近更新 更多