2016-07-30 6 views
1

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

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.table» (setDT(df1)), сгруппированные по «году», мы проверяем разницу смежных элементов «меры» меньше 0, получаем кумулятивную сумму и paste с «группой» для создания столбца «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)))) 
+0

Что это механик делает? 'cumsum (c (TRUE,' – Hatshepsut

+1

@Hatshepsut 'diff' возвращает длину, меньшую, чем исходная, поэтому мы объединяемся с' TRUE' после преобразования вывода diff в логическое, и когда мы делаем cumsum, TRUE/FALSE коэрцирует до двоичного и для каждого значения TRUE, добавляется. – akrun