Данные панели первых различий в зависимости от дополнительных переменных R

У меня есть набор данных панели, который выглядит следующим образом

ID     Model    Month    Country      Activations  avg_price
1      VW Golf  2012-01  NL              23           5000
1      VW Golf  2012-02  NL              2            5500
1      VW Golf  2012-01  FR              8            6000
1      VW Golf  2012-02  FR              34           7000
2      Audi TT  2012-01  NL              8            6900

Теперь я хочу взять первые различия для переменных Activations и avg_price. Я делаю это с помощью функции diff(data$Activations) из пакета plm, но сначала мне нужно преобразовать фрейм данных с помощью pdata.frame(data). Так:

data_fd = pdata.frame(data)
data_fd$Activations = diff(data_fdactivations)

Это возвращает следующую ошибку, используя приведенные выше данные: duplicate couples (id-time) in resulting pdata.frame. Это потому, что у меня есть данные по разным странам, и когда я агрегирую данные по всем странам (таким образом, всего Activations и avg_price и только одна комбинация id-месяц), это работает нормально. Однако теперь я хочу взять первые отличия, также используя переменную Country.

Тогда мой кадр данных должен выглядеть так:

 ID     Model    Month    Country      Activations  avg_price
 1      VW Golf  2012-01  NL              NA           NA
 1      VW Golf  2012-02  NL             -21           500
 1      VW Golf  2012-01  FR              NA           NA
 1      VW Golf  2012-02  FR              26           1000
 etc

Кто-нибудь знает, как я могу это сделать?


r plm
person Activation    schedule 10.12.2018    source источник


Ответы (1)


Посмотрите, это то, что вы хотите?

lag_new <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L), Model = structure(c(2L, 
                                                                          2L, 2L, 2L, 1L), .Label = c("Audi TT", "VW Golf"), class = "factor"), 
                          Month = structure(c(1L, 2L, 1L, 2L, 1L), .Label = c("2012-01", 
                                                                              "2012-02"), class = "factor"), Country = structure(c(2L, 
                                                                                                                                   2L, 1L, 1L, 2L), .Label = c("FR", "NL"), class = "factor"), 
                          Activations = c(23L, 2L, 8L, 34L, 8L), avg_price = c(5000L, 
                                                                               5500L, 6000L, 7000L, 6900L), Activations_new = c(NA, -21L, 
                                                                                                                                6L, 26L, -26L), avg_price_new = c(NA, 500L, 500L, 1000L, 
                                                                                                                                                                  -100L)), row.names = c(NA, -5L), class = "data.frame")

lag_new$Activations_new <- lag_new$Activations-lag(lag_new$Activations)
lag_new$avg_price_new <- lag_new$avg_price-lag(lag_new$avg_price)
person Hunaidkhan    schedule 10.12.2018
comment
Используя этот подход, lag_new$Activations и lag(lag_new$Activations) равны, и поэтому я получаю только нули - person Activation; 10.12.2018
comment
я не получаю нуля в этом подходе - person Hunaidkhan; 10.12.2018