AVE против MAX использования данных и требований? - PullRequest
0 голосов
/ 01 ноября 2018

Итак, у меня есть набор данных, и я ищу, чтобы найти максимальную глубину эпилимниона (обозначенную пробелом между первым значением глубины '0' и 'T') Так, например, сайт «A» будет иметь максимальную глубину «2», а сайт «B» будет «5».

SITE_ID DEPTH METALIMNION TEMP_FIELD 
  A      0                    25.0            
  A      1                    26.0
  A      2                    27.0
  B      0                    10.0
  B      5         T          9.0
  B      10                   11.0
  B      15        B          21.0

Для этого же набора данных я нашел среднюю температуру эпилимниона, используя

g <- with(df, ave(as.character(METALIMNION), SITE_ID, 
          FUN = function(x) {
            x[is.na(x)] <- ""
            rev(cumsum(rev(x) == "T"))
            }))
df$EPI.T <- ave(df$TEMP_FIELD, df$SITE_ID, g)

Однако при попытке использовать функцию 'max' код не работает.

df$EPI.D <- max(df$DEPTH, df$SITE_ID, g)

Требуется ли для max данные другого типа, чем для ave? Идеальный конечный набор данных:

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

1 Ответ

0 голосов
/ 01 ноября 2018

Я не уверен, как вы пришли к своим средним / средним значениям, я не получаю те же результаты при запуске вашего кода. В любом случае, ваш подход 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

Добавление средней температуры к этому итогу тривиально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...