見出し画像

【2-5】複数のdata.frameを縦につなげる(bind_rowsの使い方)


例えば1月, 2月, 3月…と複数のcsvやExcelのシートがあったとします。
慣れない方はコピペでデータを繋げたりしますがRでは簡単につなげることができます。

こういったデータをつなげることができます。

もちろんExcelでもPower Queryを使えばつなぐことは可能ですが、今回はRを使って繋げてみたいと思います。
ちなみに今回の方法は列名の順番がバラバラでも大丈夫です!

データの準備

#pacmanパッケージがあるかを確認。なければinstall.packagesパッケージをインストール

if (!require("pacman")) install.packages("pacman")


#今回使うパッケージ
pacman::p_load(dplyr, rio)


#データの準備
url <- "https://mitti1210.livedoor.blog/data.xlsx"
入院 <- import(url, which = "入院", skip = 2)
退院 <- import(url, which = "退院", skip = 2)

head(入院)
head(退院)
こうなればOK

繋げる前に確認すること

例えば1月, 2月, 3月…と複数のcsvやExcelのシートがあったとします。
そのとき、「1月, 2月, 3月…」の情報の列がなければもし繋げた時にどのファイルから読み込んだかわからなくなることがあります。

この場合は「時期」がそれに当たりますが、ない場合は準備する必要があります。

bind_rows()の基本的な使い方

bind_rows関数は複数のdata.frameを縦に繋げます。

# 縦につなげる
temp <- bind_rows(入院, 退院)

# これでもOK
temp <- 
  入院 |> 
  bind_rows(退院)
View(temp)
1番左の列に入院と退院が並んでいます

列の順番が異なる場合

bind_rows()は列の順番がバラバラでも大丈夫です。
以下のように退院の列をバラバラにしてみても同じ結果になります。
列の順番は最初のdata.frameの列順になります。

# 退院の列の順番をバラバラにしてみる
退院2 <- 退院 |> select(2, 1, 5, 7, 6, 13, 3, 4, 8, 9, 10, 11, 12)

# 列の順番がバラバラでも大丈夫
temp2 <- bind_rows(入院, 退院2)

View(temp2) #順番は最初のdata.frameの列順になる

列の数が異なる場合

列の数が異なる場合は足りない列がNAとなります。

# 列を間引く
入院3 <- 入院 |> select(1:7) #1から7列目のみにする
退院3 <- 退院 |> select(8:13) #8から13列目のみにする
temp3 <- bind_rows(入院3, 退院3)
View(temp3)
足りない列がNAになった

型が異なる場合

型が異なるとエラーになるので注意が必要です。
今回は【2-3】のmutate()を使って型を変えてみます。
エラーが出ますのでエラーメッセージも確認してみます。
ちなみに本来数値を入れる列に"未実施"といった文字をcsvやExcelに誰か1人でも入力すると起きやすいです。

# 型を変える
退院4 <- 
  退院 |>
  mutate(testA_1 = as.character(testA_1))

str(入院)
str(退院4)
退院3のtestA_1がcharacter型になった
# これはエラーが出る
temp4 <- bind_rows(入院, 退院4)
エラーメッセージは読もうと挑戦すると少しずつ読めるようになります
Error が bind_rows()にあります
繋げられません..1つ目のtestA_1は<double(数値型)> 2つ目のtestA_1は<character(文字型)>

3つ以上のdata.frameをつなげるとき

bind_rows()では1度に3つ以上のdata.frameをつなげることも可能です。

# 3つ以上のdata.frameをつなげるにはbind_rowsを繰り返す
temp5 <- bind_rows(入院, 退院, 入院, 退院)

# 同じ結果になる
temp5 <- 
  入院 |> 
  bind_rows(退院) |> 
  bind_rows(入院) |> 
  bind_rows(退院)

View(temp5)

また以下のような場合は別の方法があります。

  • このフォルダ内にあるcsvファイル全部を読み込んで縦に繋げたい

  • このExcel内にあるシート全部を読み込んで縦に繋げたい

このような場合はmap_dfr()を使い繰り返し処理を行う方が便利です。
map関数のあれこれは今後紹介する予定です。

まとめ

今回はbind_rows()でdata.frameを縦に繋げる方法を紹介しました。
列名の順番が違っていても対応できるので、今までExcelで1つずつ手作業を行うのと比べるとコスパが全く違いますので是非試してみてください。


この記事が気に入ったらサポートをしてみませんか?