P4_mutate関数でデータの前処理をする

生データをそのままデータ分析できることは稀です。
特に授業で扱う社会調査結果では、アンケートの回答がズレていたり、複数の質問項目を組み合わせて新しい「尺度」を作る必要があったりと、何らかの「前処理」が欠かせません。

前処理時には、dplyrパッケージ(Tidyverseの中に入ってます)の mutate() 関数が活躍します。
mutate は「列の追加」や「列の上書き」を行うときに、非常に強力で便利です。
以下にMutateの使い方の例をお示します。前処理にお役立てください。

実践1:スコアのズレを修正する

アンケートの回答が「0: 全く当てはまらない」~「10: 非常に当てはまる」だったが、入力データを見たら1~11と入力されていた。
(なぜ、こんなことをするのか、と大きなため息をついてください)

本来この変数の「0」にはゼロ的な役割があるだろうし、再度「0~10点」に直したい、という場合:

naiman_c2 <- naiman_c1 %>%
mutate(q1_1 = q1_1 – 1)

mutate()の基本的な構文は mutate(列名 = やりたい処理) です。
ここで重要なポイントは、=の左側で指定した「列名」がデータ内に既に存在するかどうかです。

  • 列名が既存の場合 → その列を「上書き」します。 今回の例では q1_1 という列は naiman_c1 に既に存在します。
    そのため、mutateq1_1 列の中身を q1_1 - 1 の計算結果で丸ごと置き換えます(上書きします)。
  • 列名が新規の場合 → 新しい列を「追加」します。 もしデータに存在しない名前(例えば q1_1_new)を指定すると、mutateは新しい列をデータの末尾(いちばん右側)に追加します。(この「追加」の機能は、次の「実践2」で見ていきます。)

今回は既存の列の値を修正したかったので、「上書き」の機能を使ったわけです。

実践2:逆転項目を処理する

心理尺度などでは、「ポジティブな質問」と「ネガティブな質問(逆転項目)」が混在していることがあります。
例えば、5段階評価(1~5点)で、他の項目は点数が高いほどポジティブなのに、ある項目だけ点数が高いほどネガティブな意味になっている場合、点数をひっくり返す必要があります。

【逆転のための計算ルール】
逆転処理の基本的なルールは「(入力された尺度の最大値 + 1) – 元の値」です。

例:5段階評価の逆転項目 q40_1 を処理する場合

6 - 今の値」 と計算をする(6から今の値を引く)ことで、点数を逆転できるのを想像してください。
(1点 → 5点, 2点 → 4点, …, 5点 → 1点)

# naiman_c2 を元に、q40_1 を逆転処理して naiman_c3 を作る

naiman_c3 <- naiman_c2 %>%
mutate( q40_1_r = 6 – q40_1 )

【ポイント】 逆転処理したことが後から分かるように、元の列(q40_1)は残したまま、
q40_1_r (r は reverse の意味) と新しい列として追加することもできます。
 (q40_1として上書きしても全く問題になりません。)

演習のケースのように、原則とは違い「1〜5で入力されたものを、0〜4の尺度に変換したい」場合は少しアレンジが必要です。 

ケース1:5段階評価
状況: 本来は0~4点で記録すべきところ、1~5点で入力されてしまった。
変換ルール: 1→4, 2→3, 3→2, 4→1, 5→0
計算式: 5 – 元の値


ケース2:11段階評価
状況: 本来は0~10点で記録すべきところ、1~11点で入力されてしまった。
変換ルール: 1→10, 2→9, …, 10→1, 11→0
計算式: 11 – 元の値

実践3:複数の項目を足して「尺度」を計算する

特定の複数の質問項目を合計して、一つの総合得点(尺度得点)を計算するのも、mutate() の得意技です。

例:q40_3, q40_4, q40_5 を足して、新しい尺度 scale_K を作る

# naiman_c3 を元に、複数の項目を足し合わせたKを加えた naiman_c4 を作る
naiman_c4 <- naiman_c3 %>%
mutate( scale_K = q40_3 + q40_4 + q40_5 )

【解説】

新しい変数を作ったあとは、Glimpseなどを用いて、きちんと計算されているかを確認しましょう。

【番外編】前処理の前に!最強の初手 janitor::clean_names()

mutate() を使うことで、面倒なデータの前処理を、安全かつ分かりやすく進めることができます。

ところで、与えられるデータセットの変数名はRが扱える形になっていますか?
日本語やスペース、記号が含まれた列名になっていると、mutate()で列を指定する際にエラーが起きやすく、手間がかかります。

そんな「扱いにくい変数名」を一瞬で、かつ自動で、Rが扱いやすい形式に整えてくれる魔法の呪文が、janitorパッケージのclean_names()関数です。

データを読み込んだら、mutate()を使い始める前の「お約束」として、まずこの関数で列名を”掃除”することをお勧めします。

# janitorパッケージを読み込む
library(janitor)

# データを読み込んだ直後を想定
naiman_c1 <- naiman %>%
janitor::clean_names()

全ての変数名が小文字のアルファベットと数字、アンダースコア(_)だけになり、扱いやすくなります。