Р: Как рассчитать максимальное преимущество столбца в следующих нескольких строках по группам? - PullRequest
0 голосов
/ 09 марта 2020

Рассмотрим

a = data.frame(order = runif(1e7), id = sample(1000, 1e7, replace=TRUE), num = runif(1e7))

Я хочу вычислить max группы num led 1 в n строк по id.

Например, в dplyr Я могу сделать ниже, чтобы вычислить максимальное количество отведений 1, 2, 3 строк

library(dplyr)
a2 = a %>%
  group_by(id) %>%
  arrange(order) %>%
  mutate(max_num = pmax(lead(num, 1), lead(num, 2), lead(num, 3), na.rm=T)) %>% 
  ungroup(id) %>% 
  arrange(id, order)

Но это кажется действительно неэффективным и требует большого набора текста (для больших n). Есть ли более элегантный и эффективный способ добиться этого?

1 Ответ

1 голос
/ 09 марта 2020

Опция с использованием data.table:

library(data.table)
n <- 3L
setDT(a, key=c("id", "order"))[, 
    max_num := do.call(pmax, c(shift(num, -n:-1L), list(na.rm=TRUE))), id]
a

Выход:

                 order   id       num   max_num
       1: 0.0001883428    1 0.8529981 0.7802871
       2: 0.0002661028    1 0.7802871 0.8935886
       3: 0.0003412480    1 0.1904755 0.8935886
       4: 0.0004550556    1 0.7339801 0.8935886
       5: 0.0004603295    1 0.8935886 0.6957475
      ---                                      
 9999996: 0.9996615215 1000 0.9226337 0.3970948
 9999997: 0.9997126870 1000 0.1964909 0.6950569
 9999998: 0.9997212037 1000 0.2761086 0.6950569
 9999999: 0.9998292420 1000 0.3970948 0.6950569
10000000: 0.9998487560 1000 0.6950569        NA

данные:

library(data.table)
set.seed(0L)
nr <- 1e7
a = data.frame(order = runif(nr), id = sample(1000, nr, replace=TRUE), num = runif(nr))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...