57038


rで前年比または増減率を求めるプログラムを作りたいのですが、どう処理すればいいのかわからず困っています。  
データは教育用標準データセットのssdseを使っており、以下の様な内容です。  
（仮に人口の増減率を知りたいとします。ただし、人口の増減率を知りたいわけではないので気にしないでください。）

[code]

    年度　　都道府県　　人口　　面積
    2016   北海道　　　〇〇〇　××
    2015   北海道　　　〇〇〇　××
    2014   北海道　　　〇〇〇　××
    …
    2005   北海道
    2016   青森県　　　〇〇　　××
    以下同様
    
[/code]

都道府県はfactor、年度や人口、ほかのものはint型になっています。  
最初はmutateを使おうとしましたが、mutateは一括で列を追加するものなのでうまくいきませんでした。また、summariseやapply関数も考えましたが同じようにうまくいきませんでした。  
前年比の定義としては2016年の人口/2015年の人口というように考えています。

些細なことでもいいのでよろしくお願いします。

以下のプログラムはmutate関数で作ったプログラムです。（4列目に人口があります。2016年～2005年で12年分のデータがあります。）

[code]

    for(i in 1:12){
      if(i==12){
        ss[i,]<-filter(ssdse,都道府県=="北海道")%>%
          mutate(前年比=NA)
      }
      else{
        ss[i,]<-filter(ssdse,都道府県=="北海道")%>%
          mutate(前年比=ssdse[i,4]/ssdse[i+1,4])
      }
    }
    
[/code]


CC BY-SA 4.0
2019-07-30T09:02:30.280
57031
2019-07-30T11:50:04.837
2019-07-30T11:18:17.257
3060
34824
question
r
前年比または増減率を求めるプログラムを教えてください。


↓dplyrパッケージのgroup_byとlag関数を用いた例です。

[code]

    library(dplyr)
    
    # デモデータ作成
    df <- data.frame(
      year = rep(seq(2005, 2016), 2),
      pref = as.factor(rep(c("北海道", "青森県"), each = 12)),
      pop = as.integer(runif(12 * 2, 100, 200))
    )
    
    
    print(df)
    #>    year   pref pop
    #> 1  2005 北海道 176
    #> 2  2006 北海道 149
    ...
    #> 11 2015 北海道 110
    #> 12 2016 北海道 126
    #> 13 2005 青森県 109
    #> 14 2006 青森県 127
    ...
    #> 23 2015 青森県 135
    #> 24 2016 青森県 125
    
    # 都道府県別人口増加率算出
    df %>% 
      # 都道府県別に集計
      dplyr::group_by(pref) %>% 
      # 年度で並び替え
      dplyr::arrange(year) %>% 
      # 増加率(当年の人口/前年の人口)算出
      dplyr::mutate(
        rate = pop/dplyr::lag(pop)
      )
    #> # A tibble: 24 x 4
    #> # Groups:   pref [2]
    #>     year pref     pop   rate
    #>    <int> <fct>  <int>  <dbl>
    #>  1  2005 北海道   176 NA    
    #>  2  2005 青森県   109 NA    
    #>  3  2006 北海道   149  0.847
    #>  4  2006 青森県   127  1.17 
    #>  5  2007 北海道   162  1.09 
    #>  6  2007 青森県   155  1.22 
    ...
    
    
[/code]


CC BY-SA 4.0
2019-07-30T11:50:04.837
57038
2019-07-30T11:50:04.837
35310
57031
answer