Использование transform
.
transform(df[order(-df$year), ],
generation=factor(year, labels=-(2:0)))
# group year generation
# 3 aaa 2018 0
# 6 bbb 2018 0
# 9 ccc 2018 0
# 2 aaa 2017 -1
# 5 bbb 2017 -1
# 8 ccc 2017 -1
# 1 aaa 2016 -2
# 4 bbb 2016 -2
# 7 ccc 2016 -2
Если данные несколько отличаются, например, группа bbb
сбой в год 2017
df2 <- df[-5, ]
мы могли бы вставить ave
в него, чтобы получить правильное количество поколений.
transform(df2[order(-df2$year), ],
generation=factor(
with(df2, ave(as.numeric(group), year, FUN=seq)),
labels=-(0:2)))
# group year generation
# 3 aaa 2018 0
# 6 bbb 2018 0
# 9 ccc 2018 0
# 2 aaa 2017 -1
# 8 ccc 2017 -1
# 1 aaa 2016 -2
# 4 bbb 2016 -1
# 7 ccc 2016 -2
Данные
df <- structure(list(group = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L,
3L, 3L), .Label = c("aaa", "bbb", "ccc"), class = "factor"),
year = c(2016L, 2017L, 2018L, 2016L, 2017L, 2018L, 2016L,
2017L, 2018L)), class = "data.frame", row.names = c(NA, -9L
))