У меня есть некоторые данные панели, которые выглядят так (код для ввода моего набора данных в конце):
countrycode year X
1 ARG 2015 2
2 ARG 2016 2
3 ARG 2017 1
4 AUS 2015 1
5 AUS 2016 3
6 AUS 2017 2
7 USA 2015 6
8 USA 2016 5
9 USA 2017 8
И я хотел бы отличить переменную X (то есть вычесть прошлогоднюю X изХ этого года)Он отлично работает, когда я не использую каналы:
library(tidyverse)
library(plm)
pdf <- pdata.frame(df, index = c("countrycode", "year"))
# This works perfectly
pdf <- mutate(pdf, dX = pdf$X - lag(pdf$X))
Результаты - это именно то, что я хотел бы: каждое значение dX в 2015 году равно NA, потому что нет значения X для сравнения в 2014 году.
countrycode year X dX
1 ARG 2015 2 NA
2 ARG 2016 2 0
3 ARG 2017 1 -1
4 AUS 2015 1 NA
5 AUS 2016 3 2
6 AUS 2017 2 -1
7 USA 2015 6 NA
8 USA 2016 5 -1
9 USA 2017 8 3
Но когда я пытаюсь использовать%>%:
pdf <- pdf %>% mutate(dX2 = X - lag(X))
, результаты больше не учитывают структуру панели.Посмотрите, как dX2 пытается различие между странами?Таким образом, dX2 для США в 2015 году должно быть NA, но вместо этого должно быть 4.
countrycode year X dX dX2
1 ARG 2015 2 NA NA
2 ARG 2016 2 0 0
3 ARG 2017 1 -1 -1
4 AUS 2015 1 NA 0
5 AUS 2016 3 2 2
6 AUS 2017 2 -1 -1
7 USA 2015 6 NA 4
8 USA 2016 5 -1 -1
9 USA 2017 8 3 3
Есть ли способ использовать трубы в plm или с данными панели?
Полный код здесь:
library(tidyverse)
library(plm)
df <- data.frame(stringsAsFactors=FALSE,
countrycode = c("ARG", "ARG", "ARG", "AUS", "AUS", "AUS", "USA", "USA",
"USA"),
year = c(2015L, 2016L, 2017L, 2015L, 2016L, 2017L, 2015L, 2016L,
2017L),
X = c(2L, 2L, 1L, 1L, 3L, 2L, 6L, 5L, 8L)
)
df
# using panel
pdf <- pdata.frame(df, index = c("countrycode", "year"))
# This works perfectly
pdf <- mutate(pdf, dX = pdf$X - lag(pdf$X))
pdf
# Pipe doesn't work across the panel
pdf <- pdf %>% mutate(dX2 = X - lag(X))
pdf