質問: rで前年比または増減率を求めるプログラムを作りたいのですが、どう処理すればいいのかわからず困っています。 データは教育用標準データセットのssdseを使っており、以下の様な内容です。 (仮に人口の増減率を知りたいとします。ただし、人口の増減率を知りたいわけではないので気にしないでください。) ``` 年度 都道府県 人口 面積 2016 北海道 〇〇〇 ×× 2015 北海道 〇〇〇 ×× 2014 北海道 〇〇〇 ×× ... 2005 北海道 2016 青森県 〇〇 ×× 以下同様 ``` 都道府県はfactor、年度や人口、ほかのものはint型になっています。 最初はmutateを使おうとしましたが、mutateは一括で列を追加するものなのでうまくいきませんでした。また、summariseやapply関数も考えましたが同じようにうまくいきませんでした。 前年比の定義としては2016年の人口/2015年の人口というように考えています。 些細なことでもいいのでよろしくお願いします。 以下のプログラムはmutate関数で作ったプログラムです。(4列目に人口があります。2016年~2005年で12年分のデータがあります。) ``` 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]) } } ```
回答: ↓dplyrパッケージのgroup_byとlag関数を用いた例です。 ``` 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 #> #> 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 ... ```