www.crosshyou.info

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

R言語で自動的にサマリー統計値を計算する関数を作ってみた。

R言語のsummary関数は便利なのですが、標準偏差や変動係数が算出されないことが不満でした。探せばそういう関数あるのかもしれないですが、関数を作る練習として、自作してみました。


# 自動でsummary関数、標準偏差、変動係数を出力する関数

jidou_sammary <- function(df) {

# Step1 列数の確認
retsu_suu <- length(colnames(df))
retsu_suu

# Step2 forで繰り返し
for(i in 1:retsu_suu) {
print(colnames(df)[i]) # 変数名を出力
print(summary(dfi))# summary関数を出力

# if構文で数値型だったら標準偏差と変動係数も出力
if(is.numeric(dfi) == TRUE) {
print("標準偏差")
print(sd(dfi))
print("変動係数")
print(sd(dfi) / mean(dfi, na.rm = TRUE))
}
# if構文終わり

print("") # 1行あけるため
} # for構文終わり

# Step3 retsu_suuの削除
rm(retsu_suu)
}

こんな感じです。

f:id:cross_hyou:20190824102853j:plain

早速、関数を実行してみます。

R言語にあらかじめ用意されているデータセットでいくつか試します。

まずは、irisから

f:id:cross_hyou:20190824103114j:plain

うまく動きました。Petal.Widthの変動係数が一番大きいですね。Speciesはsetosa, versicolor, virginicaの三種類で50個ずつです。

次は、carsでやってみます。

f:id:cross_hyou:20190824103403j:plain

carsはspeedとdistの2種類ですね。distのほうが変動係数が大きいです。

次は、womenで実行してみます。

f:id:cross_hyou:20190824103647j:plain

これもうまくいきました。

あ、データの数を数えるようにしましょう。


# 自動でsummary関数、標準偏差、変動係数を出力する関数

jidou_sammary <- function(df) {

# Step1 列数の確認
retsu_suu <- length(colnames(df))
retsu_suu

# Step2 forで繰り返し
for(i in 1:retsu_suu) {
print(colnames(df)[i]) # 変数名を出力
print(summary(dfi))# summary関数を出力

# if構文で数値型だったら標準偏差と変動係数も出力
if(is.numeric(dfi) == TRUE) {
print("標準偏差")
print(sd(dfi))
print("変動係数")
print(sd(dfi) / mean(dfi, na.rm = TRUE))
}
# if構文終わり

print(length(dfi) - sum(is.na(dfi)))# データの数
print("") # 1行あけるため
} # for構文終わり

# Step3 retsu_suuの削除
rm(retsu_suu)
}

 print(length(dfi) - sum(is.na(dfi)))というのを追加して、NAを除いたデータの数を数えるようにしました。うまく動くか調べてみます。

f:id:cross_hyou:20190824104736j:plain

まず、NAを含んだ変数のあるテスト用のデータフレームを作成しました。

さあ、関数を実行します。

f:id:cross_hyou:20190824104937j:plain

あ、標準偏差と変動係数がNAになっちゃいましたね。!sd関数にna.rm = TRUEをつけ忘れましたね!


# 自動でsummary関数、標準偏差、変動係数を出力する関数

jidou_sammary <- function(df) {

# Step1 列数の確認
retsu_suu <- length(colnames(df))
retsu_suu

# Step2 forで繰り返し
for(i in 1:retsu_suu) {
print(colnames(df)[i]) # 変数名を出力
print(summary(dfi))# summary関数を出力

# if構文で数値型だったら標準偏差と変動係数も出力
if(is.numeric(dfi) == TRUE) {
print("標準偏差")
print(sd(dfi, na.rm = TRUE))
print("変動係数")
print(sd(dfi, na.rm = TRUE) / mean(dfi, na.rm = TRUE))
}
# if構文終わり

print("データ数")
print(length(dfi) - sum(is.na(dfi)))# データの数
print("") # 1行あけるため
} # for構文終わり

# Step3 retsu_suuの削除
rm(retsu_suu)
}

と編集しました。

これでもう一度やってみます。

f:id:cross_hyou:20190824105335j:plain

うまくいきました。はじめのAという変数のデータ数は4になりました。

今回は以上です。