準備
両方ともに、中々インターネットを探してみても情報が少ないので、あちらこちらか情報を掻き集めて比較してみようと思う。
データには、irisやflightsは馴染みがなく、かつデータ数が多過ぎて検証が難しいので、次のサンプルを使用します。
このデータは、
気象庁のページからダウンロードしたものなので、自分の居住地のものが欲しい人は、こちらからダウンロードしてください。
データ入力
|
# データ入力 data<-read.csv("2017.csv") |
(1) plyr
① 各月ごとの最高気温の平均を計算
|
library(plyr) # 各月の最高気温の平均を計算 ddply(data,"month",summarize, AveTemp = mean(high)) #> month AveTemp #> 1 1 10.35806 #> 2 2 11.09286 #> 3 3 12.60645 #> 4 4 18.66333 |
①-1 .()関数を使用する
.()を使用します。結果は、上と同じです。
|
# .()関数 ddply(data,.(month),summarize, AveTemp = mean(high)) |
② 最高気温の平均と標準偏差を計算
|
# 各月の最高気温の平均と標準偏差を計算する ddply(data,.(month),summarize, AveTemp = mean(high), SdTemp=sd(high)) #> month AveTemp SdTemp #> 1 1 10.35806 3.177921 #> 2 2 11.09286 2.893150 #> 3 3 12.60645 2.795107 #> 4 4 18.66333 3.697481 |
③ 列の追加
最高気温の平均を列に追加します。
|
# 元のデータに各月の最高気温の平均を追加する ddply(data,"month",transform, AveTemp = mean(high)) #> date year month day high low AveTemp #> 1 20170101 2017 1 1 13.8 1.4 10.35806 #> 2 20170102 2017 1 2 13.1 1.9 10.35806 #> 3 20170103 2017 1 3 13.2 2.1 10.35806 #> 4 20170104 2017 1 4 12.8 1.7 10.35806 |
(2) dplyr
① 各月ごとの最高気温の平均を計算
|
# 各月の最高気温の平均を計算 data %>% group_by(month) %>% summarise( AveTemp = mean(high)) #> month AveTemp #> <int> <dbl> #> 1 1 10.4 #> 2 2 11.1 #> 3 3 12.6 #> 4 4 18.7 |
② 最高気温の平均と標準偏差を計算
|
# 最高気温の平均と標準偏差を計算 data %>% group_by(month) %>% summarise(AveTemp=mean(high), SdTemp=sd(high)) #> month AveTemp SdTemp #> <int> <dbl> <dbl> #> 1 1 10.4 3.18 #> 2 2 11.1 2.89 #> 3 3 12.6 2.80 #> 4 4 18.7 3.70 |
②-1 最高気温の平均と標準偏差を計算
summarise_at を使った場合。結果は、上と同じです。
|
data %>% group_by(month) %>% summarise_at("high",funs(AveTemp==mean,SdTemp=sd)) |
②-2 最高と最低気温の平均と標準偏差を計算
|
# 最高と最低気温の平均と標準偏差を計算 data %>% group_by(month) %>% summarise_at(c("high","low"),funs(AveTemp==mean,SdTemp=sd)) #> month high_AveTemp low_AveTemp high_SdTemp low_SdTemp #> <int> <dbl> <dbl> <dbl> <dbl> #> 1 1 10.4 0.506 3.18 2.49 #> 2 2 11.1 1.96 2.89 2.12 #> 3 3 12.6 3.48 2.80 2.32 #> 4 4 18.7 9.91 3.70 3.34 |
③ 列の追加
最高気温の平均を列に追加します。
|
# 元のデータに各月の最高気温の平均を追加する dth <- data %>% group_by(month) %>% mutate( AveHigh = mean(high) ) #> date year month day high low AveHigh #> <int> <int> <int> <int> <dbl> <dbl> <dbl> #> 1 20170101 2017 1 1 13.8 1.40 10.4 #> 2 20170102 2017 1 2 13.1 1.90 10.4 #> 3 20170103 2017 1 3 13.2 2.10 10.4 #> 4 20170104 2017 1 4 12.8 1.70 10.4 |
これを年月でグループ化してみましょう。
|
group_by(data, year, month) %>% # 年月でグループ化 summarise( AveHigh = mean(high, na.rm = TRUE), # 月ごとの平均最高気温 AveLow = mean(low, na.rm = TRUE), # 月ごとの平均最低気温 SumPrec = sum(prec, na.rm = TRUE) # 月ごとの降水量 ) #> year month AveHigh AveLow SumPrec #> <int> <int> <dbl> <dbl> <dbl> #> 1 2017 1 10.4 0.506 36.5 #> 2 2017 2 11.1 1.96 30.5 #> 3 2017 3 12.6 3.48 92.5 #> 4 2017 4 18.7 9.91 145 #> 5 2017 5 24.4 15.5 56.0 |
おまけ
条件付きデータカウント
各月別に真夏日を数えてみよう。
知らないと、意外に面倒。データ数を数えるのでcountと思いきやエラー。sumを使うのが正解だそうです。
|
# 真夏日の日数カウント data %>% group_by(month) %>% summarise(真夏日の日数 = sum(high >= 30)) #> month 真夏日の日数 #> <int> <int> #> 1 1 0 #> 2 2 0 #> 3 3 0 |
もののついでに棒グラフで表示してみる。
|
library(ggplot2) data %>% group_by(month) %>% summarise(真夏日の日数 = sum(high >= 30)) %>% ggplot(aes(x = factor(month), y = 真夏日の日数)) + geom_bar(stat = "identity") |

取り敢えずここまで。