データアナリストのメモ帳

データアナリストのメモ帳

IT企業で働くデータアナリストのブログ

【R言語】dplyrを使えばExcelの集計作業を代替できてしかも速い!

今回はR言語のdplyrの紹介です。
表計算をするなら使いたいパッケージ、それがdplyrです。

  • 項目ごとの集計(Excelで言うsumif的なもの)
  • ユニークカウント
  • Excelで言うVLOOKUPをLEFT JOINで行う

などなど・・・dplyrを身につければExcel要らず!になれるはずです。

では早速やってみましょう。
サンプルデータに台湾行政区人口順位表を使います。

ダウンロード
(クリックするとCSVファイルがダウンロードされます。)

CSVファイルの読み込み

まずはダウンロードしたファイルを読み込みます。
Rstudioで以下を実行してください。

taiwan_cities <- read.csv("taiwan_cities.csv", header=TRUE, fileEncoding="UTF-8-BOM")

このファイル、 fileEncoding="UTF-8 とすると読み込めなかったのですが、 fileEncoding="UTF-8-BOM こうすると読み込めました。なんでかはよくわからないです・・・

▼Rstudioでの読み込み結果がこちら
dplyr

次に、面積、人口、人口密度のクラスを変更します。試しに以下のように入力すると、

class(taiwan_cities$人口)
# [1] "factor"

と factor が返ってきます。数値に変換しないといけませんね。

CSV取り込みでよくやる前処理なのですが、ここではカンマを取ってから数値に直す、という処理をしないといけません。面倒ですがやってみましょう。

taiwan_cities$人口 <- gsub(",", "", taiwan_cities$人口)

こうすると、カンマ(",")をスペース("")で置換できます。面積と、人口密度にも同じ処理をしましょう。
さらに、as.numeric()でクラスを数値に変換します。小数点がある場合は、round()で整数にしてしまいましょう。

taiwan_cities$面積 <- round(as.numeric(gsub(",", "", taiwan_cities$面積)), digits = 0)

dplyrで集計をする

分類の列を見ると、直轄市、県、市という値が入っていることがわかります。
この分類ごとに、面積と人口を合計し、さらに人口密度を算出してみましょう。

library(dplyr)
taiwan_cities_bunrui <- taiwan_cities %>% dplyr::group_by(分類) 
%>% summarise(各分類の数 = n(), 
        面積の合計 = sum(面積), 
        人口の合計 = sum(人口), 
        人口密度 = round(人口の合計 / 面積の合計, digits = 0))

結果、こうなります。
dplyr

ここで、直轄市、県、市のそれぞれの数を知りたかったので、各分類の数 = n()として、個数を数えています。

さらにこれを人口で降順に並べ替えたいなら、arrange()とdesc()を用いて、

taiwan_cities_bunrui <- taiwan_cities_bunrui %>% dplyr::arrange(desc(人口の合計))

とすれば、降順で表示できます。

LEFT JOINで2つのテーブルをくっつける(VLOOKUP的な処理)

次に、各行政区に自分が行ったことがある/ないのテーブルを読み込みましょう。
まずは、CSVをダウンロード。

ダウンロード
(クリックするとCSVファイルがダウンロードされます。)

read.csv()で読み込みましょう。

taiwan_exp <- read.csv("taiwan_exp.csv", header=TRUE, fileEncoding="UTF-8-BOM")

こんなファイルです。

dplyr

ここには行ったことがある行政区しか載せていないため、最初のファイル(taiwan_cities)とは行の数が合いません。

さて、最初のテーブル(taiwan_cities)と今読み込んだテーブル(taiwan_exp)をLEFT JOINでくっつけてみましょう!
ExcelのVLOOKUPと同じようなことができます。

taiwan_cities_exp <- dplyr::left_join(taiwan_cities, taiwan_exp, by = "行政区")

dplyr

こんなふうになります!元のテーブルの右側に、列が加わりました。

left_joinの説明をすると、

dplyr::left_join(左側に置きたいテーブル, 右側に置きたいテーブル, by = "キー")

となります。

左側のテーブルを基準としているため、左側のテーブルはすべての行が残りますが、右側のテーブルは必ずしもすべてが残るわけではありません。(今回はたまたま残っていますが。)

また、左側にあって右側にない場合は、NAとなります。(NULLとなります。)

以上の要領でdplyrを駆使していけばマジでExcelいらずになります!
処理も速いし最高ですね。もうExcelには戻れませんよ・・・