dplyr mutate найти максимум n следующих значений в столбце - PullRequest
0 голосов
/ 24 июня 2018

С учетом следующего тибля:

library(tidyverse)

set.seed(1)

my_tbl = tibble(x = rep(words[1:5], 50) %>% sort(),
                y = 1:250,
                z = sample(seq(from = 30 , to = 90, by = 0.1), size = 250, replace = T)) 

я пытаюсь создать новый столбец который заполнит максимальное значение следующих 3 значений в столбце z

например

для строки 1 max_3_next должно быть 84,5 (для строки 4)

для строки 5 max_3_next должно быть 86,7 (из строки 7)

вот что я пытаюсь сделать:

my_tbl %>%
  mutate(max_next_3 =  max(.$z[(y + 1):(y + 3)])) 

> my_tbl %>%
+   mutate(max_3_next =  max(.$z[(y + 1):(y + 3)])) 
# A tibble: 250 x 4
   x         y     z max_3_next
   <chr> <int> <dbl>      <dbl>
 1 a         1  45.9       84.5
 2 a         2  52.3       84.5
 3 a         3  64.4       84.5
 4 a         4  84.5       84.5
 5 a         5  42.1       84.5
 6 a         6  83.9       84.5
 7 a         7  86.7       84.5
 8 a         8  69.7       84.5
 9 a         9  67.8       84.5
10 a        10  33.7       84.5
# ... with 240 more rows
Warning messages:
1: In (y + 1):(y + 3) :
  numerical expression has 250 elements: only the first used
2: In (y + 1):(y + 3) :
  numerical expression has 250 elements: only the first used

Я получаю вышеупомянутые предупреждения

Как мне изменить код для достижения желаемого результата?

Я предпочитаю решение dplyer Но я также буду рад узнать и о других решениях, поскольку производительность - это проблема так как исходный набор данных может иметь 1 M ~ строк

Спасибо Рафаэль

1 Ответ

0 голосов
/ 24 июня 2018

Мы можем использовать rollmax из zoo библиотеки с align="left", чтобы дать указание окну из текущего наблюдения вместе со следующими двумя наблюдениями

library(zoo)
my_tbl %>%
   mutate(max_3_next = rollmax(z,3, fill = NA, align = "left"))


# A tibble: 250 x 4
    x        y    z     max_3_next
  <chr>    <int> <dbl>    <dbl>
 1 a         1  45.9       64.4
 2 a         2  52.3       84.5
 3 a         3  64.4       84.5
 4 a         4  84.5       84.5
 5 a         5  42.1       86.7
 6 a         6  83.9       86.7
 7 a         7  86.7       86.7
 8 a         8  69.7       69.7
 9 a         9  67.8       67.8
10 a        10  33.7       42.3   
# ... with 240 more rows

Извините, я считаю, что неправильно понял ОП. Итак, вот правильное решение, вдохновленное Джошуа Ульрихом ответами на этот вопрос - Надеюсь. Я оставлю предыдущий ответ на всякий случай, который понадобится будущим читателям.

my_tbl %>% 
       mutate(max_3_next = rollapply(z, list((1:3)), max, fill=NA, align = "left", partial=TRUE))  

  # A tibble: 250 x 4
  x         y     z   max_3_next
  <chr> <int> <dbl> <dbl>
1 a         1  45.9  84.5
2 a         2  52.3  84.5
3 a         3  64.4  84.5
4 a         4  84.5  86.7
5 a         5  42.1  86.7
6 a         6  83.9  86.7
7 a         7  86.7  69.7
8 a         8  69.7  67.8
9 a         9  67.8  42.3
10 a        10  33.7  71.2
 # ... with 240 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...