В этом решении используется dplyr
. Здесь я создаю фрейм данных со случайными данными для демонстрационных целей:
df <- data.frame(year = sample(2010:2018, 100, replace = TRUE),
z = runif(100))
Далее я группирую по годам и делаю вырезки, используя стандартные отклонения. Затем я разгруппирую полученный тибл.
df %>%
group_by(year) %>%
mutate(category = cut(z,
breaks = c(-Inf, mean(z) - sd(z), mean(z) + sd(z), Inf),
labels = c("Low", "Medium", "High"))) %>%
ungroup
Результат выглядит примерно так (например, для 2010 года):
# # A tibble: 11 x 3
# year z category
# <int> <dbl> <fct>
# 1 2010 0.585 Medium
# 2 2010 0.951 High
# 3 2010 0.747 Medium
# 4 2010 0.802 Medium
# 5 2010 0.673 Medium
# 6 2010 0.662 Medium
# 7 2010 0.102 Low
# 8 2010 0.129 Low
# 9 2010 0.934 High
# 10 2010 0.270 Medium
# 11 2010 0.270 Medium
Ваш код может выглядеть так:
df %>%
group_by(year) %>%
mutate(SEStercile = cut(SESindex_z,
breaks = c(-Inf, mean(SESindex_z) - sd(SESindex_z), mean(SESindex_z) + sd(SESindex_z), Inf),
labels = c("Low", "Medium", "High"))) %>%
ungroup