Добавление столбца переменных отставания между 2 фреймами данных в R - PullRequest
0 голосов
/ 25 января 2019

У меня есть два фрейма данных временных рядов с одинаковыми датами (скажем, фреймы данных называются df1 и df2).Я хочу добавить несколько столбцов в df1, которые имеют отставание valeus от df2

Я пробовал функцию отставания, но она только выведет 1 отставание в 1 столбце.

Создание 2 фреймов данных

Date <-  seq.Date(as.Date("2004-01-01"), as.Date("2004-01-06"), by ="day")

df1 <- data.frame(
  Date,
  Price = sample(c(1:9), length(Date), replace = TRUE))

df2 <- data.frame(
  Date,
  Catch = c(sample(c(1:100), 2, replace = TRUE), NA,
            sample(c(1:100), 2, replace = TRUE), NA))

Мои df1 и df2 выглядят так,

>df1
       Date     Price
>1 2004-01-01     2
>2 2004-01-02     4
>3 2004-01-03     7
>4 2004-01-04     9
>5 2004-01-05     6
>6 2004-01-06     9

>df2
       Date    Catch
>1 2004-01-01    95
>2 2004-01-02    14
>3 2004-01-03    NA
>4 2004-01-04   100
>5 2004-01-05    87
>6 2004-01-06    NA

Я пытался использовать функцию задержки:

df1$lag_catch_01 <- lag(df2$Catch, k = 1)

, что дает мне:

       Date     Price lag_catch
>1 2004-01-01     2        NA
>2 2004-01-02     4        95
>3 2004-01-03     7        14
>4 2004-01-04     9        NA
>5 2004-01-05     6       100
>6 2004-01-06     9        87

Но я действительно хочу вывод, подобный этому:

       Date      Price lag_catch_01 lag_catch_02
>1 2004-01-01     2           NA           NA
>2 2004-01-02     4           95           NA
>3 2004-01-03     7           14           95
>4 2004-01-04     9           NA           14
>5 2004-01-05     6          100           NA
>6 2004-01-06     9           87          100

Я думаю, я мог бы использовать функции задержки несколько раз, как это:

df1$lag_catch_01 <- lag(df2$Catch, k = 1)
df1$lag_catch_02 <- lag(df2$Catch, k = 2)

Но если бы я захотел сделать 20 столбцов, каждый с 20-дневным лагом, это стало бы очень утомительно.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Предполагая, что эти два лага работают так, как вам нужно, но нужно динамически увеличивать количество лагов, просто назначьте новые столбцы для вывода матрицы с помощью sapply:

df1[paste0("lag_catch_", 1:20)] <- sapply(1:20, function(i) lag(df2$Catch, k = i))
0 голосов
/ 25 января 2019

Вы можете вычислить лаги в их собственном data.frame, используя plyr, а затем объединить их:

library(plyr)
library(dplyr)

df1 %>% bind_cols(data.frame(t(ldply(1:4, lag, x= (df2$Catch)))))

Таким образом, ldply(1:4, lag, x= (df2$Catch), скажем, для списка (l в ldply) применяется 1: 4функция запаздывает и возвращает data.frame (d в ldply) с другими именованными аргументами в конце.Остальное просто убирает, так как в этом случае созданный data.frame неверен

...