dplyr: среднее по диапазону на основе первого вхождения в другом столбце - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы использовать dyplr и mutate для создания новой переменной, которая равна 0 или усредняет значения в столбце y, в зависимости от диапазона от столбца z.

Для столбца z range я хотел бы использовать первый раз z> = 90 для максимального значения диапазона, а затем первый раз z = 31 непосредственно перед z> = 90 для минимального значения диапазона.

Примечание: я буду группировать по столбцу х

Например:

x  y   z 
1  100  0 
1  90   0 
1  90  31 
1  90  60 
1  80  31 
1  75  60 
1  60  90
1  60  60
2  60   0
2  60  30

Я бы усреднил y по этому диапазону:

  x  y   z
  1  80  31
  1  75  60
  1  60  90

так что в итоге я получу значение 71,7 (мне нет дела до округления).

x  y   z  ave
1  100  0    0
1  90   0    0
1  90  31    0
1  90  60    0
1  80  31 71.7
1  75  60 71.7
1  60  90 71.7
1  60  60    0 
2  60   0    0
2  60  30    0

1 Ответ

0 голосов
/ 21 января 2019

Мы можем сделать

df %>% group_by(x) %>% mutate(ave = {
  if(any(z >= 90)) {
    idxU <- which.max(z >= 90)
    idxL <- max(which(z[1:idxU] == 31))
    replace(z * 0, idxL:idxU, mean(z[idxL:idxU]))
  } else {
    0
  }
})
#    x   y  z      ave
# 1  1 100  0  0.00000
# 2  1  90  0  0.00000
# 3  1  90 31  0.00000
# 4  1  90 60  0.00000
# 5  1  80 31 60.33333
# 6  1  75 60 60.33333
# 7  1  60 90 60.33333
# 8  1  60 60  0.00000
# 9  2  60  0  0.00000
# 10 2  60 30  0.00000

Итак, idxU - это верхний предел диапазона, idxL - нижний предел, затем в последней строке мы заменяем элементы idxL:idxU нуля.вектор z * 0 на требуемое среднее.

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