Создать столбец индекса на основе существующих групп строк (с дубликатами)

Вопрос похож на (Обновить) Добавить столбец индекса в data.frame на основе двух столбцов

Вот мой пример data.frame:

df = read.table(text = 'ID  Day Count   Count_group 
77661   14498   4   5
76552   14498   4   5
37008   14498   4   5
34008   14498   4   5
30004   14497   1   5
30004   14497   1   4   
28047   14496   3   4   
28049   14496   3   4   
29003   14496   3   4   
69012   14468   1   4   
69007   14467   3   4   
69012   14467   3   4   
69020   14467   3   4   
42003   13896   2   4   
42011   13896   2   4   
22001   13895   2   4   
23007   13895   2   4   
28047   14496   3   3   
28049   14496   3   3   
29003   14496   3   3   
69007   14467   3   3   
69012   14467   3   3   
69020   14467   3   3   
48005   14271   2   2   
48007   14271   2   2   
22001   13895   2   2   
23007   13895   2   2   
47011   14320   1   2   
73005   14319   1   2   
73005   14319   1   1', header = TRUE)

Столбец Count показывает сумму значений ID, сгруппированных по Day. Count_group показывает сумму уникальных Count значений, сгруппированных по Day и Day -1.

Мне нужно создать столбец индекса, который группирует Count_group по Day и Day -1 в порядке убывания df (с дубликатами!).

Вот мой ожидаемый результат:

ID     Day  Count Count_group index_col
77661   14498   4   5           1
76552   14498   4   5           1
37008   14498   4   5           1
34008   14498   4   5           1
30004   14497   1   5           1
30004   14497   1   4           2
28047   14496   3   4           2
28049   14496   3   4           2
29003   14496   3   4           2
69012   14468   1   4           3
69007   14467   3   4           3
69012   14467   3   4           3
69020   14467   3   4           3
42003   13896   2   4           4
42011   13896   2   4           4
22001   13895   2   4           4
23007   13895   2   4           4
28047   14496   3   3           5
28049   14496   3   3           5
29003   14496   3   3           5
69007   14467   3   3           6
69012   14467   3   3           6
69020   14467   3   3           6
48005   14271   2   2           7
48007   14271   2   2           7
22001   13895   2   2           8
23007   13895   2   2           8
47011   14320   1   2           9
73005   14319   1   2           9
73005   14319   1   1          10

И сделайте то же самое, но с index_col группировкой по 3 дням: Day, Day -1 и Day -2:

    df_2 = read.table(text = 'ID Day Count Count_group
30004   14497   1   5
28047   14496   3   5
28049   14496   3   5
29003   14496   3   5
69012   14495   1   5
69007   14467   3   5
69012   14467   3   5
69020   14467   3   5
42003   14466   1   5
42011   14465   1   5
28047   14496   3   4
28049   14496   3   4
29003   14496   3   4
69012   14995   1   4
22001   13895   2   4
23007   13895   2   4
28047   13894   2   4
28049   13894   2   4
42003   14466   1   2
42011   14465   1   2
28047   13894   2   2
28049   13894   2   2
69012   14995   1   1
42011   14465   1   1', header = TRUE)

Ожидаемый результат:

ID     Day  Count Count_group index_col
30004   14497   1   5           1
28047   14496   3   5           1
28049   14496   3   5           1
29003   14496   3   5           1
69012   14495   1   5           1
69007   14467   3   5           2
69012   14467   3   5           2
69020   14467   3   5           2
42003   14466   1   5           2
42011   14465   1   5           2
28047   14496   3   4           3
28049   14496   3   4           3
29003   14496   3   4           3
69012   14995   1   4           3
22001   13895   2   4           4
23007   13895   2   4           4
28047   13894   2   4           4
28049   13894   2   4           4
42003   14466   1   2           5
42011   14465   1   2           5
28047   13894   2   2           6
28049   13894   2   2           6
69012   14995   1   1           7
42011   14465   1   1           8

Есть ли у вас предложения? Я хочу создать общий код, который можно было бы применить (с некоторыми изменениями) как к df, df_2, так и к другим data.frames с переменной группировки n дней.


person aaaaa    schedule 29.05.2017    source источник
comment
Я думаю, что это опечатка df_2 в строке 5, значение Day. Должно быть 14495 из 14995.   -  person rconradin    schedule 30.05.2017
comment
вопрос обновлен с новым df   -  person aaaaa    schedule 30.05.2017
comment
Возможно ли иметь что-нибудь вроде: 76552 14498 3 4 \n 37008 14498 3 4 \n 34008 14498 3 4 \n 30004 14497 1 4 \n 30004 14497 1 4? И каков процесс вычисления столбца Count, потому что он не понимает, как можно иметь строки 5-6 с Count=1.   -  person rconradin    schedule 31.05.2017


Ответы (1)


Использование dplyr:

df %>% mutate(index_col = cumsum(!c(+Inf,diff(Day))%in%c(0,-1)))

Объяснение:

 c(+Inf,diff(Day))

Поскольку вы хотите два дня подряд, я вычисляю разницу на Day с помощью diff(Day). В качестве diff возвращаемого вектора размера n-1 я должен добавить значение для вершины вектора, я выбираю +Inf.

!(... %in% c(0,-1))

Я проверяю, что значение совпадает с Day или Day-1, поскольку они должны быть сгруппированы, я хочу, когда это не так.

cumsum(...)

Наконец, я использую cumsum, чтобы узнать, сколько изменений произошло.

Результат:

Это работа для ваших двух экземпляров

> df %>% mutate(index_col = cumsum(!c(+Inf,diff(Day))%in%c(0,-1)))

      ID   Day Count Count_group index_col
1  30004 14497     1           4         1
2  28047 14496     3           4         1
3  28049 14496     3           4         1
4  29003 14496     3           4         1
5  69012 14468     1           4         2
6  69007 14467     3           4         2
7  69012 14467     3           4         2
8  69020 14467     3           4         2
9  42003 13896     2           4         3
10 42011 13896     2           4         3
11 22001 13895     2           4         3
12 23007 13895     2           4         3
13 28047 14496     3           3         4
14 28049 14496     3           3         4
15 29003 14496     3           3         4
16 69007 14467     3           3         5
17 69012 14467     3           3         5
18 69020 14467     3           3         5
19 48005 14271     2           2         6
20 48007 14271     2           2         6
21 22001 13895     2           2         7
22 23007 13895     2           2         7
23 47011 14320     1           2         8
24 73005 14319     1           2         8
25 73005 14319     1           1         8

а также

> df_2 %>% mutate(index_col = cumsum(!c(+Inf,diff(Day))%in%c(0,-1)))

      ID   Day Count Count_group index_col
1  30004 14497     1           5         1
2  28047 14496     3           5         1
3  28049 14496     3           5         1
4  29003 14496     3           5         1
5  69012 14495     1           5         1
6  69007 14467     3           5         2
7  69012 14467     3           5         2
8  69020 14467     3           5         2
9  42003 14466     1           5         2
10 42011 14465     1           5         2
11 28047 14496     3           4         3
12 28049 14496     3           4         3
13 29003 14496     3           4         3
14 69012 14495     1           4         3
15 22001 13895     2           4         4
16 23007 13895     2           4         4
17 28047 13894     2           4         4
18 28049 13894     2           4         4
19 42003 14466     1           2         5
20 42011 14465     1           2         5
21 28047 13894     2           2         6
22 28049 13894     2           2         6
23 69012 14995     1           1         7
24 42011 14465     1           1         8
person rconradin    schedule 29.05.2017