Мы можем использовать ave
здесь и создать группирующую переменную, которая будет принимать каждые 6 строк в одной группе.Хотя мы берем 6 строк в одной группе, нам нужно sd
только из 3 unique
значений, следовательно sd(unique(x))
.
df$dev <- ave(df$mean, rep(1:nrow(df), each = 6, length.out = nrow(df)),
FUN = function(x) sd(unique(x)))
df
# date count mean dev
#1 2012-07-01 2.3498695 1.524178 0.1902995
#2 2012-08-01 0.6984866 1.524178 0.1902995
#3 2012-09-01 0.9079118 1.896867 0.1902995
#4 2012-10-01 2.8858218 1.896867 0.1902995
#5 2012-11-01 1.2406948 1.777372 0.1902995
#6 2012-12-01 2.3140496 1.777372 0.1902995
#7 2013-01-01 1.5904573 2.421820 0.7558814
#8 2013-02-01 3.2531825 2.421820 0.7558814
#9 2013-03-01 4.2962963 3.812503 0.7558814
#10 2013-04-01 3.3287101 3.812503 0.7558814
#11 2013-05-01 3.7698413 2.603770 0.7558814
#12 2013-06-01 1.4376997 2.603770 0.7558814
#13 2013-07-01 5.0687285 4.760392 2.0555158
#14 2013-08-01 4.4520548 4.760392 2.0555158
#15 2013-09-01 5.5063913 5.537038 2.0555158
#16 2013-10-01 5.5676856 5.537038 2.0555158
#17 2013-11-01 6.2686567 8.644863 2.0555158
#18 2013-12-01 11.0210697 8.644863 2.0555158
Чтобы понять, как была создана переменная группировки
rep(1:nrow(df), each = 6, length.out = nrow(df))
#[1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3
Я знаю, что OP не нуждается в tidyverse
решении, но в случае, если кто-то в будущем столкнется с этим постом и ему понадобится, он может использовать ответ ниже.
Логика та же самая, только что преобразованная из базы R в dplyr
.Здесь важно создавать группы.
library(dplyr)
df %>%
group_by(group = rep(1:n(), each = 6, length.out = n())) %>%
mutate(dev = sd(unique(mean))) %>%
select(-group)