我有一些类似于以下的面板数据(输入数据集的代码位于末尾):
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减去去年的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如何尝试在不同国家/地区进行差异化?因此,2015年美国的dX2应该是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
答案 0 :(得分:2)
您需要指定您使用的是来自dplyr的延迟(而不是plm)。
pdf <- pdf %>%
group_by(countrycode) %>%
mutate(dX2 = X - dplyr::lag(X))
结果:
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 NA
5 AUS 2016 3 2 2
6 AUS 2017 2 -1 -1
7 USA 2015 6 NA NA
8 USA 2016 5 -1 -1
9 USA 2017 8 3 3
答案 1 :(得分:1)
我相信这与为什么
具有相同的原因with(pdf, X - lag(X))
没有给出预期的答案(尊重面板结构),但是:
[1] NA 0 -1 0 2 -1 4 -1 3
对with()
的求值发生在第一个参数内部,并通过访问这样的pdata.frame,使用pdata.frame的内部结构,其中列不是pseries
对象,而是裸骨类型(例如数字)。通过使用$
访问器访问pdata.frame的列,那一刻该列将变成pseries
,并使用了可以遵守面板结构的正确lag
方法。
我的猜测是,管道运算符(eval
)定义中的%>%
构造以相同的方式求值第一个参数。
(这是pdata.frame
对象的当前定义的缺点)。