R - Вычисления с переменной лагом по группам - PullRequest
0 голосов
/ 15 апреля 2019

Используя следующий набор данных:

set.seed(2)
origin <- rep(c("DEU", "GBR", "ITA", "NLD", "CAN", "MEX", "USA", "CHN", "JPN", "KOR","DEU", "GBR", "ITA", "NLD", "CAN", "MEX", "USA", "CHN", "JPN", "KOR"), 6)
dest <- rep(c("GBR", "ITA", "NLD", "CAN", "MEX", "USA", "CHN", "JPN", "KOR","DEU", "GBR", "ITA", "NLD", "CAN", "MEX", "USA", "CHN", "JPN", "KOR", "DEU"), 6)
year <- rep(c(rep(1998, 10), rep(1999, 10), rep(2000, 10)), 2)
type <- rep(c(1,2,3,4,5), 12)
# type <- sample(1:10, size=length(origin), replace=TRUE)
a <- sample(100:10000, size=length(origin), replace=TRUE)
b <- sample(1000:100000, size=length(origin), replace=TRUE)
data.df <- as.data.frame(cbind(origin, dest, year, type, a,b))
rm(origin, year, dest, type, a,b)

Я хотел бы, например, вычислить следующую операцию:

  • [a t + 1 ijk - a t ijk ] * b t ik

iбудучи type, j origin и k dest.Я решил сначала вычислить задержку a, lag.a с помощью dplyr:

data.df <- data.df %>%
            group_by(origin, dest, type) %>%
            mutate(lag.a = lag(a, n = 1, default = NA))

Я думаю, что этот путь верен, даже если я не очень хорошо понимаю, как R может понять в одиночку, что такое отсчет временирассмотреть ... ??

Кстати, тем самым я получил результат, соответствующий первой части (a t + 1 ijk - a t ijk ) моих вычислений.Моя проблема в том, что я теперь не знаю, как я могу это сделать (lag.a t + 1 ijk * b t ik )... Любая идея?

Если возможно, я бы хотел решение (dplyr или data.table) без изменения переменной lag в наборе данных, чтобы не утяжелить его больше, чем необходимо.

1 Ответ

1 голос
/ 15 апреля 2019

В вашем коде есть пара проблем.Сначала создайте свой data.frame следующим образом:

data.df <- data.frame(origin, dest, year, type, a, b)

Это сохранит класс всех векторов.Обратите внимание, что если вы не хотите, чтобы origin и dest были факторами, просто используйте аргумент stringsAsFactors = FALSE в функции data.frame().

Далее создайте новую переменную следующим образом:

data.df2 <- data.df %>%
  group_by(origin, dest, type) %>%
    arrange(year) %>% 
    mutate(new_var = (a - lag(a)) * b) %>%
  ungroup()

Здесь new_var - это переменная, которую вы хотите.Вы правы в том, что dplyr не знает, что задержанное значение относится к предыдущему периоду времени.Поэтому вы должны использовать arrange(year).

...