1 день, 3 дня и 7 дней для всех столбцов в R - PullRequest
3 голосов
/ 15 апреля 2020

У меня 158 столбцов в наборе данных. Я хочу создать 3 новых столбца (1_day, 3_day и 7_day lag) для каждого столбца. enter image description here

data <- data.frame(DATE = c("1/1/2016","1/2/2016","1/3/2016","1/4/2016","1/5/2016","1/6/2016","1/7/2016","1/8/2016","1/9/2016","1/10/2016",
Attr1 = c(5,8,7,6,2,1,4,1,2),
Attr2 = c(10,23,32,12,3,2,5,3,21), 
Attr3 = c(12,23,43,3,2,4,1,23,33))

Требуемый результат выглядит следующим образом: enter image description here

Attr1_3D = Среднее значение за последние 3 дня ATTR1 Attr1_7D = Средние значения последних 7 дней ATTR1

Attr2_3D = Среднее значение за последние 3 дня ATTR2 Attr2_7D = Средние значения последних 7 дней ATTR2

Attr3_3D = Среднее значение за последние 3 дня ATTR3 Attr3_7D = Средняя величина последних 7 дней ATTR3

1 Ответ

2 голосов
/ 15 апреля 2020

Один подход с использованием tidyverse и zoo приведен ниже. Вы можете использовать rollapply из пакета zoo для получения скользящих средств (на 1, 3 или 7 дней).

Редактировать : Также добавлено смещение на 1 день (в качестве скользящего среднего значения включаются на следующий день после окна X-day). Также присоединяется к исходному фрейму данных для включения исходных Attr столбцов.

library(tidyverse)
library(zoo)

data %>%
  pivot_longer(starts_with("Attr"), names_to = "Attr", values_to = "Value") %>%
  group_by(Attr) %>%
  mutate(Attr_1D = rollapply(Value, 1, mean, align = 'right', fill = NA),
         Attr_3D = rollapply(Value, 3, mean, align = 'right', fill = NA),
         Attr_7D = rollapply(Value, 7, mean, align = 'right', fill = NA),
         DATE = lead(DATE)) %>%
  pivot_wider(id_cols = DATE, names_from = "Attr", values_from = c("Attr_1D", "Attr_3D", "Attr_7D")) %>%
  right_join(data)

Вывод

# A tibble: 9 x 13
  DATE     Attr_1D_Attr1 Attr_1D_Attr2 Attr_1D_Attr3 Attr_3D_Attr1 Attr_3D_Attr2 Attr_3D_Attr3 Attr_7D_Attr1 Attr_7D_Attr2 Attr_7D_Attr3 Attr1 Attr2 Attr3
  <fct>            <dbl>         <dbl>         <dbl>         <dbl>         <dbl>         <dbl>         <dbl>         <dbl>         <dbl> <dbl> <dbl> <dbl>
1 1/1/2016            NA            NA            NA         NA            NA            NA            NA             NA            NA       5    10    12
2 1/2/2016             5            10            12         NA            NA            NA            NA             NA            NA       8    23    23
3 1/3/2016             8            23            23         NA            NA            NA            NA             NA            NA       7    32    43
4 1/4/2016             7            32            43          6.67         21.7          26            NA             NA            NA       6    12     3
5 1/5/2016             6            12             3          7            22.3          23            NA             NA            NA       2     3     2
6 1/6/2016             2             3             2          5            15.7          16            NA             NA            NA       1     2     4
7 1/7/2016             1             2             4          3             5.67          3            NA             NA            NA       4     5     1
8 1/8/2016             4             5             1          2.33          3.33          2.33          4.71          12.4          12.6     1     3    23
9 1/9/2016             1             3            23          2             3.33          9.33          4.14          11.4          14.1     2    21    33

Данные

data <- structure(list(DATE = structure(1:9, .Label = c("1/1/2016", "1/2/2016", 
"1/3/2016", "1/4/2016", "1/5/2016", "1/6/2016", "1/7/2016", "1/8/2016", 
"1/9/2016"), class = "factor"), Attr1 = c(5, 8, 7, 6, 2, 1, 4, 
1, 2), Attr2 = c(10, 23, 32, 12, 3, 2, 5, 3, 21), Attr3 = c(12, 
23, 43, 3, 2, 4, 1, 23, 33)), class = "data.frame", row.names = c(NA, 
-9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...