子集面板观察

时间:2019-12-10 09:17:02

标签: r 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)

1 个答案:

答案 0 :(得分:2)

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

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)