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
に既に存在します。
そのため、mutate
はq1_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()
全ての変数名が小文字のアルファベットと数字、アンダースコア(_
)だけになり、扱いやすくなります。