У меня есть столбец значений 'v', сгруппированный столбцом 'id', который указывает, являются ли значения стандартными ('s') или собраны в поле (1.1 - 1.5; 2.1 - 2.5), например:
id v
1 s 8
2 s 3
3 s 3
4 1.1 7
5 1.2 3
6 1.3 6
7 1.4 5
8 1.5 10
9 s 3
10 s 8
11 s 6
12 2.1 2
13 2.2 8
14 2.3 1
15 2.4 4
16 2.5 3
17 s 5
18 s 2
19 s 5
Для каждой последовательности полевых измерений мне нужно сразу вычислить среднее и стандартное отклонение всех стандартных значений до и после фокусной группы значений поля. Таким образом, для первой группы образцов полей 1.1–1.5 мне нужно вычислить среднее значение и sd «v» для предыдущего (строки 1-3) и следующих (строки 9-11) блоков стандартных значений. Аналогично для второй группы полевых образцов (2.1-2.5) мне нужны среднее и стандартное отклонение стандартных значений в строках 9-11 и 17-19.
Обратите внимание, что количество образцов и стандартов варьируется в зависимости от набора данных . Они не всегда имеют конфигурацию 3-5-3-5, как в этом упрощенном примере.
Желаемый результат:
id v v_mean v_sd
1 s 8 NA NA
2 s 3 NA NA
3 s 3 NA NA
4 1.1 7 5.17 2.48 # 5.17 = mean of previous and following run of standard values
5 1.2 3 5.17 2.48 # mean(d$v[c(1:3, 9:11)])
6 1.3 6 5.17 2.48 # 2.48 = sd of previous and following run of standard values
7 1.4 5 5.17 2.48 # sd(d$v[c(1:3, 9:11)])
8 1.5 10 5.17 2.48
9 s 3 NA NA
10 s 8 NA NA
11 s 6 NA NA
12 2.1 2 4.83 2.14 # 4.83 = mean(d$v[c(9:11, 17:19)])
13 2.2 8 4.83 2.14 # 2.14 = sd(d$v[c(9:11, 17:19)])
14 2.3 1 4.83 2.14
15 2.4 4 4.83 2.14
16 2.5 3 4.83 2.14
17 s 5 NA NA
18 s 2 NA NA
19 s 5 NA NA
Эти вопросы были полезны: Как сделать взять среднее значение между диапазоном строк в R? и Как получить среднее из последних 10 значений в столбце перед отсутствующим значением с помощью R? , но моя проблема заключается в постоянном смещении из средних.
Данные:
d = structure(list(id = c("s", "s", "s", "1.1", "1.2", "1.3","1.4", "1.5", "s", "s", "s",
"2.1", "2.2", "2.3", "2.4", "2.5", "s", "s", "s"),
v = c(8, 3, 3, 7, 3, 6, 5, 10, 3,
8, 6, 2, 8, 1, 4, 3, 5, 2, 5)),
row.names = c(NA, -19L), class = "data.frame", index = integer(0))