计算其他实体的面板数据的百分比变化

时间:2020-07-01 17:13:57

标签: r

我有一个非常大的数据框,采用面板数据的形式。该数据具有多年内各个国家/地区各个行业生产的经济信息。我想找到一个代码,用于计算同一行业内此输出的年度百分比变化,但将不同国家/地区的这一变化汇总为同一行之一。

听起来很难(很难解释),所以我举一个例子。使用此代码:

panel <- cbind.data.frame(industry =  rep(c("Logging" , "Automobile") , each = 9) ,
               country = rep(c("Austria" , "Belgium" , "Croatia") , each = 3 , times = 2) ,
               year = rep(c(2000:2002) , times = 6) ,
               output = c(2,3,4,1,5,8,1,2,4,2,3,4,6,7,8,9,10,11))

这给出了这个矩阵:

     industry country year output
1     Logging Austria 2000      2
2     Logging Austria 2001      3
3     Logging Austria 2002      4
4     Logging Belgium 2000      1
5     Logging Belgium 2001      5
6     Logging Belgium 2002      8
7     Logging Croatia 2000      1
8     Logging Croatia 2001      2
9     Logging Croatia 2002      4
10 Automobile Austria 2000      2
11 Automobile Austria 2001      3
12 Automobile Austria 2002      4
13 Automobile Belgium 2000      6
14 Automobile Belgium 2001      7
15 Automobile Belgium 2002      8
16 Automobile Croatia 2000      9
17 Automobile Croatia 2001     10
18 Automobile Croatia 2002     11

我使用tidyverse计算每个行业的变化百分比:

library(tidyverse)

panel <- panel %>%
  group_by(country , industry) %>%
  mutate(per_change = (output - lag(output)) / lag(output))

给予:

# A tibble: 18 x 5
# Groups:   country, industry [6]
   industry   country  year output per_change
   <fct>      <fct>   <int>  <dbl>      <dbl>
 1 Logging    Austria  2000      2     NA    
 2 Logging    Austria  2001      3      0.5  
 3 Logging    Austria  2002      4      0.333
 4 Logging    Belgium  2000      1     NA    
 5 Logging    Belgium  2001      5      4    
 6 Logging    Belgium  2002      8      0.6  
 7 Logging    Croatia  2000      1     NA    
 8 Logging    Croatia  2001      2      1    
 9 Logging    Croatia  2002      4      1    
10 Automobile Austria  2000      2     NA    
11 Automobile Austria  2001      3      0.5  
12 Automobile Austria  2002      4      0.333
13 Automobile Belgium  2000      6     NA    
14 Automobile Belgium  2001      7      0.167
15 Automobile Belgium  2002      8      0.143
16 Automobile Croatia  2000      9     NA    
17 Automobile Croatia  2001     10      0.111
18 Automobile Croatia  2002     11      0.1  

所以我想要一个为第1行NA,第2行给出除2001年奥地利(4 + 1)= 5之外的所有伐木业百分比变化总和的代码,第3行给出2002年,除奥地利(0.6 +1)= 1.6,第4行再次不适用,第5行2001年伐木百分比变化总和,比利时(1.5)除外,....

我不知道该怎么做。

请同时提供一个灵活的代码,该代码应能够识别N个国家和Y个行业。

1 个答案:

答案 0 :(得分:1)

您可以

  • 首先按行业和年份对“面板”表进行分组,以求和“ per_change”
  • 第二次将此分组表与主表连接起来
  • 最后从“分组总和”中减去“ per_change”

代码输入后:

d1<-as.data.frame(panel)

attach(panel)

d2<-aggregate(per_change~industry+year, FUN=sum)

detach(panel)

library(dplyr)
panel<-left_join(d1,d2, by=c("industry"="industry", "year"="year"))

panel$exc_per_change<-panel$per_change.y-panel$per_change.x

输出是

> head(panel)
  industry country year output per_change.x per_change.y exc_per_change
1  Logging Austria 2000      2           NA           NA             NA
2  Logging Austria 2001      3    0.5000000     5.500000       5.000000
3  Logging Austria 2002      4    0.3333333     1.933333       1.600000
4  Logging Belgium 2000      1           NA           NA             NA
5  Logging Belgium 2001      5    4.0000000     5.500000       1.500000
6  Logging Belgium 2002      8    0.6000000     1.933333       1.333333