代码之家  ›  专栏  ›  技术社区  ›  Jeremy K.

R: plm面板数据:如何使用管道?

  •  0
  • Jeremy K.  · 技术社区  · 6 年前

    我有一些面板数据如下所示(输入数据集的代码在末尾):

      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))
    

    与2015年的结果相比,没有。

      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))
    

      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
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Randall Helms    6 年前

    您需要指定使用的是dplyr的lag(而不是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
    
        2
  •  1
  •   Helix123    6 年前

    with(pdf, X - lag(X))
    

    未按预期给出答案(关于面板结构),但:

    [1] NA  0 -1  0  2 -1  4 -1  3
    

    评估 with() pseries 对象而不是裸骨骼类型(例如,数字)。通过访问pdata.frame的列 $ 访问器,则列变成 在那一刻正确的 lag 所用方法可以考虑面板结构。

    我猜是 eval 在管道操作员的( %>% )definition以相同的方式计算其第一个参数。

    (这是当前定义的一个缺点 pdata.frame 对象)。