R rename_all() で変数名を一気に変更
最近は、 Dr.STONE みてます。そそりますね。
e-statからデータを取ってきたときとか、たまに変数名以外にもいらない要素がついてるときってありますよね。
そんな時、dplyr::rename_all
と正規表現が少しわかれば人生が豊かになるかもしれません。
環境
> sessionInfo() R version 3.6.1 (2019-07-05) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 18362)
仮想データ生成
今回は変数名の先頭部分の要素を落とすという設定で書いてみます。
> library(tidyverse) umr <- data.frame( V122_sakana = 1:10, V3455_oniku = runif(10), V974333_yasai = 1, V63_omame = sample(c(T,F),10,replace = T) ) > umr V122_sakana V3455_oniku V974333_yasai V63_omame 1 1 0.6840092 1 TRUE 2 2 0.4950602 1 FALSE 3 3 0.8039745 1 TRUE 4 4 0.2525578 1 FALSE 5 5 0.8230913 1 FALSE 6 6 0.4581368 1 FALSE 7 7 0.9348471 1 TRUE 8 8 0.1878316 1 FALSE 9 9 0.6919405 1 TRUE 10 10 0.8223904 1 TRUE
変数名の先頭部分に「V122_」といったように、V+可変数値+「アンダーバー」がついて主要な変数名が後に続くとしますします。
主要な変数名だけを残して、それ以外のところは除外したいですよね。
そんな時は、dplyr::rename_all
を使うといいんじゃないでしょうか。
dolyr::rename()
dplyr::rename
は変数名を変更する関数です。
> rename(umr,sakana = V122_sakana) sakana V3455_oniku V974333_yasai V63_omame 1 1 0.6840092 1 TRUE 2 2 0.4950602 1 FALSE 3 3 0.8039745 1 TRUE 4 4 0.2525578 1 FALSE 5 5 0.8230913 1 FALSE 6 6 0.4581368 1 FALSE 7 7 0.9348471 1 TRUE 8 8 0.1878316 1 FALSE 9 9 0.6919405 1 TRUE 10 10 0.8223904 1 TRUE
一つ目の変数が「V122_sakana
→ sakana
」になってますね。これを一つ一つするのは大変なので、一気に変数名に適用してしまおうというのがdplyr::rename_all()
。
解答例
では先に、やり方を書きます
> umr %>% + rename_all(vars(umr %>% #変数名抽出 + colnames() %>% #一文字目が文字or数字で可変から_まで除外 + str_remove(.,"^[:alnum:]+_"))) sakana oniku yasai omame 1 1 0.6840092 1 TRUE 2 2 0.4950602 1 FALSE 3 3 0.8039745 1 TRUE 4 4 0.2525578 1 FALSE 5 5 0.8230913 1 FALSE 6 6 0.4581368 1 FALSE 7 7 0.9348471 1 TRUE 8 8 0.1878316 1 FALSE 9 9 0.6919405 1 TRUE 10 10 0.8223904 1 TRUE
うぇい。
説明します。
dplyr::rename_all()
dplyr::rename_all()
では、引数vars()
を取る必要があります。今回は、中に関数処理を施していますが、変数名とオブジェクト(文字型ベクトル)の要素数が等しければオブジェクトで受け渡し可能です。
> umr_name <- c("fish","meat","vege","bean") > umr %>% rename_all(vars(umr_name)) fish meat vege bean 1 1 0.6840092 1 TRUE 2 2 0.4950602 1 FALSE
上記と同じ処理を施したものをumr_name
というオブジェクトに入れて、rename_all(vars(umr_name))
としても受け渡せます。
rename_all()
の本質的な情報はここですね。最悪、このルールさえわかれば力業で何とかなります。ただ、変数名が628個あったらどうします?(A. 死にます)
そんなとき、正規表現を少し知っておくと生きることができます。
dplyr::rename_all()
の中のお噺
> umr %>% + colnames() %>% + str_remove(.,"^[:alnum:]+_") [1] "sakana" "oniku" "yasai" "omame"
vars()
の中にピックアップしてみてみると、
- 変数名を変えたいデータセットオブジェクトを選択(今回は
umr
) colnames()
で変数名をベクトルとして抽出stringr::str_remove()
で選択した要素を除外
って感じですね。1,2はrename_all()
を使うとしたら、大抵使うと思います。
では、最後の正規表現の説明を...
先っちょだけ正規表現のお噺
「"^[:alnum:]+_"
」こいつですね。
^
:先頭を示す。今回は一文字目から取り除くのが確定していたのでつけます。つけなくても動作しますが、予期せぬエラーを防げます。ちなみに、末尾の場合は$
[:alnum:]
:アルファベットor数字なら何でもOK(記号はダメよ)+
:直前の要素が1回以上繰り返す場合に使います。今回は「V+可変数値」だったのでつけます。_
:変数名についてるアンダーバー
つまり「先頭が可変のアルファベットor数値でアンダーバーの部分までマッチする要素」を選択していることになります。
この辺の、正規表現の知識は私も詳しくないので、Rチートシートの
stringrとregular expression(正規表現)が非常に参考になります。
そそりますね。こいつは