見出し画像

【2-3】Rで列の追加や修正を行うmutate()の使い方

はじめに

第2章ではdata.frameの使い方について紹介しています。

今回は列の追加や修正を行うmutate()について紹介します。

mutate()のイメージ

Excelでは新しい列を作ったり、既存の列を一度に修正する作業と似ています。

パッケージと使うデータの準備

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

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

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

基本的な使い方

まずはtestAが1-4までありますが、`testA_sum`という新しい列に合計を計算していきます。

今回mutate()の使い方ではありますが、使わない方法も含めて4通り紹介します。全て同じ結果が出力されますのでコードを打ちながら確認してみてください。列名ですが、既にある列名を使うとその列が修正されます。新しい列名を使うと新たに列が追加されます。

#基本的な使い方1

#mutate(`データフレーム`, `追加・修正したい列名` = `計算方法`)
temp <-
  mutate(data, testA_sum = testA_1 + testA_2 + testA_3 + testA_4)
head(temp)



#基本的な使い方2

#パイプ演算子でつなぐ。 %>% もしくは |>
temp <- 
  data |>
  mutate(testA_sum = testA_1 + testA_2 + testA_3 + testA_4)

head(temp)


#mutate()を使わない方法1

# $を使う
temp <- data
temp$testA_sum <- temp$testA_1 + temp$testA_2 + temp$testA_3 + temp$testA_4
head(temp)



#mutate()を使わない方法2

# [[]]を使う
temp <- data
temp[["testA_sum"]] <- temp$testA_1 + temp$testA_2 + temp$testA_3 + temp$testA_4
head(temp)

#3の$と#4の[[]]は第1章の応用になりますので必要に応じて復習してください。

*結果をtempという変数名に入れていますが、これは元のdataを修正しないことが目的です。もし元のデータが自分の意図しないことで加工してしまい、そのことに気づかずエラーを出してしまうのは初心者あるあるですので…

実例

型を変更する

よく使う方法として型の変更があります。型については第1章で解説しています。

【1-12】では先ほどの例で言うと#3のを使っていたことになります。これをmutate()と組み合わせる方法になります。そのため型の変更自体がわからない方は[1-12]と見比べながら進めてみてください。以下を実行して結果のどこが変わったかを確認してみてください。

#型の確認
str(data)

#idはnumeric型だった。これをcharacter型に変更してみる
temp <- 
  data |>
  mutate(id = as.character(id))
str(temp)

次にtestCが`3未満`か`4以上か`でlogical型をに変更します。ここでは4以上をTRUE、3未満をFALSEとします。

temp <- 
  data |> 
  mutate(testC = testC >= 4)
head(temp)
このTRUEとFALSEを"4以上"と"3未満"に表示する方法は次回紹介します

日付の計算

日付から期間を計算することも可能です。
今回のデータは評価日 = 入院日にしているので、結果は全て0になるはずです。日付の計算の詳細は今後記事にしていく予定ですが、まだ紹介していませんのでいずれ記事にする予定です。
str(data)を行うと入院日と評価日の型がPOSIXct型となっているのが確認できます。

POSIXct型となっている

POSIXct型の単位は秒になっていて、日数で計算したい時はas.Date()を用います。ここではperiodという列名を作ります。

temp <-
  data |> 
  mutate(period = as.Date(評価日) - as.Date(入院日))
head(temp)
同じ日なので0になっている。
もしas.Date()を使わなかったら単位はどう表記されるでしょう?

複数列を同時に行う場合

mutate()は複数列を同時に行うこともできます。その際は,で区切ります。個人的には以下のように改行すると,の忘れも減るので好きです。

temp <- 
  data |> 
  mutate(
    testC = testC >= 4,
    period = as.Date(評価日) - as.Date(入院日)
  )
head(temp)
列名ごとに改行して、列名の開始位置も揃っていると見やすいです。
,を忘れるとエラーになります。初心者あるあるなので注意
#ちなみにパイプ演算子でつなげても正しく動きます。
temp <- 
  data |> 
  mutate(testC = testC >= 4) |> 
  mutate(period = as.Date(評価日) - as.Date(入院日))
head(temp)

#もしmutateを使わなかったらこうなります。特に問題はありませんが、temp$がいっぱいになります。
temp <- data
temp$testC <- temp$testC >= 4
temp$period <- as.Date(temp$評価日) - as.Date(temp$入院日)
head(temp)

課題

課題1

testBは3つの列があります。その合計を計算してください。上記のようにtempという変数名で、列名はtestB_sumとしてください。

正解はこちら

課題2

先ほどperiodという列を作りました。

temp <-
  data |> 
  mutate(period = as.Date(評価日) - as.Date(入院日))
head(temp)

これで問題はないのですが、違う方法で同じことに挑戦します。

  1. str(data)で型を確認してください

  2. mutate()とas.Date()を用い、入院日と評価日の型を変更してください。periodの列名も作成してください。period = as.Date(評価日) - as.Date(入院日)としなくてもいいはずです。

  3. できたらもう一度str(temp)で型を確認してください。型はどうなっていますか?

正解はこちら
入院日と評価日の型がDateになりましたか?

まとめ

今回はmutate()について紹介しました。前回のselect(), filter()と合わせた3つの関数は本当によく使いますので、ぜひ慣れてみてください。

これでだけも十分活躍できますが、同じ処理を複数の列に行う場合は列の数だけ行数とコードが必要になります。全く同じ処理なのに面倒ですよね。中級レベルになるとまとめて処理する事もできるようになります。最初は練習のためにも1列ずつコードを書いて、慣れてきたら今後紹介する中級編にもチャレンジしてみてください。

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