【问题标题】:Subsetting panel observations子集面板观察
【发布时间】:2019-12-10 09:17:02
【问题描述】:

我有一个包含公司信息的 data.table。

library(data.table)
DT <- fread("
iso Firm GDP year 
A  1    1    1    
A  2    1    1    
A  3    1    1
A  4    1    1
A  5    3    2    
A  6    3    2    
A  7    3    2
A  8    3    2
B  9    2    1
B  10   2    1
B  11   2    1
B  12   2    1
B  13   4    1
B  14   4    1
B  15   4    1
B  16   4    1",
header = TRUE)

我想计算一年到另一年的 GDP 增长(每个国家/地区),并将其添加到数据集 ((N-O)/O)。但是,如果我这样做:

DT <- DT[,GDPgrowth :=((GDP- shift(GDP))/shift(GDP)), by=iso]

结果将为零,因为它会从彼此中减去坚定的观察结果。

我如何确保它为属于该国家/地区的整个公司组一起计算?

期望的输出:

library(data.table)
DT <- fread("
iso Firm GDP GDPgrowth year 
A  1    1    NA    1    
A  2    1    NA    1    
A  3    1    NA    1
A  4    1    NA    1
A  5    3    2    2    
A  6    3    2    2    
A  7    3    2    2
A  8    3    2    2
B  9    2    NA    1
B  10   2    NA    1
B  11   2    NA    1
B  12   2    NA    1
B  13   4    1    1
B  14   4    1    1
B  15   4    1    1
B  16   4    1    1",
header = TRUE)

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是从当前方法继续的一种方法:

    library(data.table)
    
    DT[,GDPgrowth :=((GDP- shift(GDP))/shift(GDP)), by=iso]
    DT[GDPgrowth == 0, GDPgrowth := NA]
    DT[, GDPgrowth:= zoo::na.locf(GDPgrowth, na.rm = FALSE), .(iso, year)]
    DT
    
    #    iso Firm GDP year GDPgrowth
    # 1:   A    1   1    1        NA
    # 2:   A    2   1    1        NA
    # 3:   A    3   1    1        NA
    # 4:   A    4   1    1        NA
    # 5:   A    5   3    2         2
    # 6:   A    6   3    2         2
    # 7:   A    7   3    2         2
    # 8:   A    8   3    2         2
    # 9:   B    9   2    1        NA
    #10:   B   10   2    1        NA
    #11:   B   11   2    1        NA
    #12:   B   12   2    1        NA
    #13:   B   13   4    1         1
    #14:   B   14   4    1         1
    #15:   B   15   4    1         1
    #16:   B   16   4    1         1
    

    使用dplyrtidyr::fill 可以这样做

    library(dplyr)
    
    DT %>%
      group_by(iso) %>%
      mutate(GDPgrowth = (GDP - lag(GDP))/lag(GDP), 
             GDPgrowth = replace(GDPgrowth, GDPgrowth == 0, NA)) %>%
      group_by(iso, year) %>%
      tidyr::fill(GDPgrowth)
    

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 2020-09-23
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多