to be continued...

Rや心理統計学の備忘録的な

There are three kinds of lies: lies, damned lies, and statistics.

- 嘘には三種類ある。嘘、大嘘、そして統計だ -
Benjamn Disraeli(19世紀のイギリス首相)

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_sakanasakana」になってますね。これを一つ一つするのは大変なので、一気に変数名に適用してしまおうというのが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()の中にピックアップしてみてみると、

  1. 変数名を変えたいデータセットオブジェクトを選択(今回はumr)
  2. colnames()で変数名をベクトルとして抽出
  3. stringr::str_remove()で選択した要素を除外

って感じですね。1,2はrename_all()を使うとしたら、大抵使うと思います。

では、最後の正規表現の説明を...

先っちょだけ正規表現のお噺

"^[:alnum:]+_"」こいつですね。

  • ^:先頭を示す。今回は一文字目から取り除くのが確定していたのでつけます。つけなくても動作しますが、予期せぬエラーを防げます。ちなみに、末尾の場合は$
  • [:alnum:]:アルファベットor数字なら何でもOK(記号はダメよ)
  • +:直前の要素が1回以上繰り返す場合に使います。今回は「V+可変数値」だったのでつけます。
  • _:変数名についてるアンダーバー

つまり「先頭が可変のアルファベットor数値でアンダーバーの部分までマッチする要素」を選択していることになります。

この辺の、正規表現の知識は私も詳しくないので、Rチートシート

stringrとregular expression(正規表現)が非常に参考になります。

そそりますね。こいつは

to be continued...