Маркировка набора данных с накоплением

Для каждого года есть две группы, где первая группа сложена поверх второй группы. Я хотел бы добавить столбец, обозначающий, в какой группе находится строка: первая или вторая. Я пометил группы для этого примера, но поле не отображается в реальном наборе данных.

year measure data ...
1991       1  ...  [group 1]
1991       2       [group 1] 
1991       3       [group 1] 
1991       1       [group 2] 
1991       2       [group 2] 
1991       3       [group 2] 
1991       4       [group 2] 
1992       1       [group 1] 
1992       2       [group 1] 
1992       3       [group 1]
1992       1       [group 2] 
1992       2       [group 2] 
1992       3       [group 2] 
1992       4       [group 2] 

1 ответ

Решение

Мы можем попробовать либо data.table, dplyr или же base R методы. С помощью data.tableмы конвертируем data.frame в data.tablesetDT(df1)), сгруппированные по 'year', мы проверяем разницу соседних элементов 'measure' меньше 0, получаем накопленную сумму, и paste с 'group', чтобы создать столбец 'grp'.

library(data.table)
setDT(df1)[, grp := paste("group", cumsum(c(TRUE, diff(measure) < 0))), year]
df1   
#    year measure     grp
#1: 1991       1 group 1
#2: 1991       2 group 1
#3: 1991       3 group 1
#4: 1991       1 group 2
#5: 1991       2 group 2
#6: 1991       3 group 2
#7: 1991       4 group 2
#8: 1992       1 group 1
#9: 1992       2 group 1
#10:1992       3 group 1
#11:1992       1 group 2
#12:1992       2 group 2
#13:1992       3 group 2
#14:1992       4 group 2

Та же методология может быть использована в dplyr

library(dplyr)
df1 %>%
  group_by(year) %>%
  mutate(grp = paste("group", cumsum(c(TRUE, diff(measure) < 0))))
Другие вопросы по тегам