R Data.Table - обработка APPLY / SHIFT по ROW (сохранение или динамическая обработка смещения) - PullRequest
2 голосов
/ 30 сентября 2019

Я хотел бы обработать данные для каждой строки. Допустим, мы собрали значение «mpg» для двух «цил» за 4 дня. Я хотел бы получить минимальное значение миль на галлон относительно дня)

Исходные данные

** день, цил, миль на галлон **

  • 1,4,34.4
  • 2,4,21,3
  • 3,4,23,3
  • 4,4,25.0
  • 1,3,23.0
  • 2, 3,27,0
  • 3,3,18.3
  • 4,3,17.3

Ожидаемый выход

** день, цил, миль на галлон, min_mpg **

  • 1,4,34,4,34,4
  • 2,4,21,3,21,3
  • 3,4,23.3,21.3
  • 4,4,25.0,21.3
  • 1,3,23.0,23.0
  • 2,3,27.0,23.0
  • 3,3,18.3,18.3
  • 4,3,17.3,17.3

Я высказал несколько соображений, как показано ниже ...

  1. Для обработки цикла (что на самом делене самые эффективные варианты)

  2. Функция ПРИМЕНИТЬ и СДВИГ (сохранить минимальное значение из предыдущей обработки строки в глобальной переменной и сбросить его на NA для каждой ГРУППЫ. Мне не удалось сохранить минимальное значение mpgзначение в глобальную переменную)

  3. APPLY и SHIFTфункция (сдвиг «-1» до строки № 1 для каждой строки. Вид зацикливания в функции APPLY. Эта опция может выполнять намного более избыточную обработку)

Я пытался использовать функцию rowShift, как описано в блоге ниже, но мое требование заключается в том, что мне нужно динамически сдвигать Использовать значениеиз предыдущей строки в расчете таблицы данных R

Доступен ли какой-либо вариант векторизации? ИЛИ Традиционный FOR LOOP будет единственным вариантом? Я предпочитаю вариант с использованием базы R (фрейм данных или таблица данных)

1 Ответ

0 голосов
/ 30 сентября 2019

Мы можем использовать cummin

library(dplyr)
df1 %>% 
   group_by(cyl) %>% 
   mutate(min_mpg = cummin(mpg))
# A tibble: 8 x 4
# Groups:   cyl [2]
#    day   cyl   mpg min_mpg
#  <int> <int> <dbl>   <dbl>
#1     1     4  34.4    34.4
#2     2     4  21.3    21.3
#3     3     4  23.3    21.3
#4     4     4  25      21.3
#5     1     3  23      23  
#6     2     3  27      23  
#7     3     3  18.3    18.3
#8     4     3  17.3    17.3

В base R мы можем использовать ave

df1$min_mpg <- with(df1, ave(mpg, cyl, FUN = cummin))

Или используя data.table

library(data.table)
setDT(df1)[, min_mpg := cummin(mpg), by = cyl][]

данные

df1 <- structure(list(day = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), cyl = c(4L, 
4L, 4L, 4L, 3L, 3L, 3L, 3L), mpg = c(34.4, 21.3, 23.3, 25, 23, 
27, 18.3, 17.3)), class = "data.frame", row.names = c(NA, -8L
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...