Как кумулятивно отслеживать уникальные комбинации по группам в R - PullRequest
0 голосов
/ 11 июня 2018

У меня есть наблюдения с уникальными идентификаторами, которые связаны с одной или несколькими START / END парой дат.Эти наблюдения повторяются для каждого идентификатора за месяц в диапазоне дат.Пример для одного уникального идентификатора и категории, усеченной по длине.

  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 в третьем.Этот счетчик будет уникальным для этого идентификатора и будет 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

Набор данных имеет миллионы других уникальных идентификаторов и 11 других категорий, но если я смогу найти решение для этого подмножества, мне следуетсмог применить его ко всему набору данных.

Я нашел решения, которые позволят мне подсчитать общее количество уникальных комбинаций ID, START, END, но ничего, что не поможет увеличитьA в каждом наблюдении только один раз, когда оно относится к новому уникальному событию START, END.

Я использовал data.table и lubridate.

1 Ответ

0 голосов
/ 11 июня 2018

Как насчет этого?

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

Если вы затем хотели отдельный столбец для каждого значения идентификатора (который кажется довольно странным, учитывая, что у вас есть миллионы уникальных значений), вы могли бы использовать что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...