Маркировка набора данных с накоплением
Для каждого года есть две группы, где первая группа сложена поверх второй группы. Я хотел бы добавить столбец, обозначающий, в какой группе находится строка: первая или вторая. Я пометил группы для этого примера, но поле не отображается в реальном наборе данных.
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))))