Я не уверен, как вы пришли к своим средним / средним значениям, я не получаю те же результаты при запуске вашего кода. В любом случае, ваш подход max(...)
не работает, потому что max(...)
не похож на avg(...)
(это функция для применения функции над группами). max(...)
просто вычисляет максимальное значение вектора значений. В этом смысле max(...)
больше похоже на mean(...)
, а не на avg(...)
.
Следующее определяет максимальные значения DEPTH
в каждой группе, которая идет «перед T». То есть в качестве примера предполагается, что ваши данные отсортированы по DEPTH
. Далее также предполагается, что минимум в каждой группе всегда равен 0.
df <- read.table(header=TRUE,sep=",",stringsAsFactors = FALSE, strip.white = TRUE,text="
SITE_ID, DEPTH, METALIMNION, TEMP_FIELD, EPI.T, EPI.D
A, 0, , 25.0, 26.0, 2
A, 1, , 26.0, 26.0, 2
A, 2, , 27.0, 26.0, 2
B, 0, , 10.0, 10.25, 5
B, 5, T, 9.0, 10.25, 5
B, 10, , 11.0, 10.25, 5
B, 15, B, 21.0, 10.25, 5")
library(dplyr)
max_by_grp <- df %>%
group_by(SITE_ID) %>%
filter(row_number() <= min(which(METALIMNION=="T"), n())) %>%
summarise(max = max(DEPTH))
print(max_by_grp)
## A tibble: 2 x 2
# SITE_ID max
# <chr> <dbl>
#1 A 2
#2 B 5
res <- merge(df, max_by_grp)
print(res)
# SITE_ID DEPTH METALIMNION TEMP_FIELD EPI.T EPI.D max
#1 A 0 25 26.00 2 2
#2 A 1 26 26.00 2 2
#3 A 2 27 26.00 2 2
#4 B 0 10 10.25 5 5
#5 B 5 T 9 10.25 5 5
#6 B 10 11 10.25 5 5
#7 B 15 B 21 10.25 5 5
Добавление средней температуры к этому итогу тривиально.