Создание следующих 4 ведущих объектов для каждого столбца в фрейме данных в R - PullRequest
0 голосов
/ 12 апреля 2020

У меня очень большой фрейм данных с несколькими показаниями (несколько столбцов) более чем в 100 странах по 98 дней в каждом.

В реальном фрейме данных есть несколько стран, несколько функций и несколько дат. Я создал образец, чтобы проиллюстрировать мою задачу. Также даты упорядочены, как представлено.

Пример набора данных

#Create sample dataframe
df <- data.frame(Date = seq(ymd("2020-01-01",tz= Sys.timezone()),ymd("2020-01-05",tz= Sys.timezone()),86400),
                 Country=c(rep("USA",5),rep("INDIA",5),rep("POLAND",5),rep("SWITZERLAND",5)),
                 var1= seq(1,20,1),var2= seq(1,20,1),var3=seq(1,20,1),val_n = seq(1,20,1))

df
         Date     Country var1 var2 var3 val_n
1  2020-01-01         USA    1    1    1     1
2  2020-01-02         USA    2    2    2     2
3  2020-01-03         USA    3    3    3     3
4  2020-01-04         USA    4    4    4     4
5  2020-01-05         USA    5    5    5     5
6  2020-01-01       INDIA    6    6    6     6
7  2020-01-02       INDIA    7    7    7     7
8  2020-01-03       INDIA    8    8    8     8
9  2020-01-04       INDIA    9    9    9     9
10 2020-01-05       INDIA   10   10   10    10
11 2020-01-01      POLAND   11   11   11    11
12 2020-01-02      POLAND   12   12   12    12
13 2020-01-03      POLAND   13   13   13    13
14 2020-01-04      POLAND   14   14   14    14
15 2020-01-05      POLAND   15   15   15    15
16 2020-01-01 SWITZERLAND   16   16   16    16
17 2020-01-02 SWITZERLAND   17   17   17    17
18 2020-01-03 SWITZERLAND   18   18   18    18
19 2020-01-04 SWITZERLAND   19   19   19    19
20 2020-01-05 SWITZERLAND   20   20   20    20

Цель Цель состоит в том, чтобы следующие 4-дневные значения каждого читать как новые столбцы, как показано ниже. Там, где нет следующих значений, следует заполнять NA.

ожидаемый результат

    Date     Country var1 var2 var3 var_n var1_next_1day var1_next_2day var1_next_3day var1_next_4day Same_var2_n
1  1-Jan         USA    1    1    1     1              2              3              4              5           …
2  2-Jan         USA    2    2    2     2              3              4              5             NA           …
3  3-Jan         USA    3    3    3     3              4              5             NA             NA           …
4  4-Jan         USA    4    4    4     4              5             NA             NA             NA           …
5  5-Jan         USA    5    5    5     5             NA             NA             NA             NA           …
6  1-Jan       INDIA    6    6    6     6              7              8              9             10           …
7  2-Jan       INDIA    7    7    7     7              8              9             10             NA           …
8  3-Jan       INDIA    8    8    8     8              9             10             NA             NA           …
9  4-Jan       INDIA    9    9    9     9             10             NA             NA             NA           …
10 5-Jan       INDIA   10   10   10    10             NA             NA             NA             NA           …
11 1-Jan      POLAND   11   11   11    11             12             13             14             15           …
12 2-Jan      POLAND   12   12   12    12             13             14             15             NA           …
13 3-Jan      POLAND   13   13   13    13             14             15             NA             NA           …
14 4-Jan      POLAND   14   14   14    14             15             NA             NA             NA           …
15 5-Jan      POLAND   15   15   15    15             NA             NA             NA             NA           …
16 1-Jan SWITZERLAND   16   16   16    16             17             18             19             20           …
17 2-Jan SWITZERLAND   17   17   17    17             18             19             20             NA           …
18 3-Jan SWITZERLAND   18   18   18    18             19             20             NA             NA           …
19 4-Jan SWITZERLAND   19   19   19    19             20             NA             NA             NA           …
20 5-Jan SWITZERLAND   20   20   20    20             NA             NA             NA             NA           …

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

В dplyr мы можем использовать lead с mutate_at, чтобы применить его к нескольким столбцам.

library(dplyr)

df %>%
  group_by(Country) %>%
  mutate_at(vars(var1:val_n), list(next_1day = ~lead(.), next_2day = ~lead(., 2),
                               next_3day = ~lead(., 3), next_4day = ~lead(., 4)))
0 голосов
/ 12 апреля 2020
library(data.table)
df <- data.table(df)
#one day
df[,var1_next_1day:=shift(var1,-1),by="Country"]
#second day 
df[,var2_next_2day:=shift(var2,-2),by="Country"]
...