いずにゃんの研究日記

専門性を広げるための練習場

はじめてのtidyr(2):2つの変数の値を1つの変数にまとめる。または逆に分割する

以下のように,名字と名前が別々の変数となっている場合に, フルネームにして1つの変数としてまとめたいという時に役に立つ方法を 解説する。まずはデータの読み込み。

library(tidyverse)
dat <-
  data_frame(
    family=c("高海","桜内","松浦","黒澤","渡辺","津島","国木田","小原","黒澤"),
    first=c("千歌","梨子","果南","ダイヤ","曜","善子","花丸","鞠莉","ルビィ")
    )
dat
# A tibble: 9 × 2
  family  first
   <chr>  <chr>
1   高海   千歌
2   桜内   梨子
3   松浦   果南
4   黒澤 ダイヤ
5   渡辺     曜
6   津島   善子
7 国木田   花丸
8   小原   鞠莉
9   黒澤 ルビィ


unite()関数で2つの変数の値を1つの変数にまとめる

早速,familyfirstをまとめてname変数を作成する。使うのはtidyrパッケージの unite()関数。なのでヘルプをみたい場合はそちらを参照。

dat %>% unite(name,family,first, sep="")
# A tibble: 9 × 1
        name
*      <chr>
1   高海千歌
2   桜内梨子
3   松浦果南
4 黒澤ダイヤ
5     渡辺曜
6   津島善子
7 国木田花丸
8   小原鞠莉
9 黒澤ルビィ

sep=""で,接続の部分に何も指定してないので,区切りなしのフルネーム となった。接続に使う記号は色々指定できる。sep=自体入れない場合は以下のように _でつながれる。こちらは後で使うので,dat2に格納しておく。

dat2 <- dat %>% unite(name,family,first)
dat2
# A tibble: 9 × 1
         name
*       <chr>
1   高海_千歌
2   桜内_梨子
3   松浦_果南
4 黒澤_ダイヤ
5     渡辺_曜
6   津島_善子
7 国木田_花丸
8   小原_鞠莉
9 黒澤_ルビィ

元の変数を残したい時は,引数にremove=FALSEを入れる。

dat %>% unite(name,family,first, remove=FALSE) 
         name family  first
*       <chr>  <chr>  <chr>
1   高海_千歌   高海   千歌
2   桜内_梨子   桜内   梨子
3   松浦_果南   松浦   果南
4 黒澤_ダイヤ   黒澤 ダイヤ
5     渡辺_曜   渡辺     曜
6   津島_善子   津島   善子
7 国木田_花丸 国木田   花丸
8   小原_鞠莉   小原   鞠莉
9 黒澤_ルビィ   黒澤 ルビィ


separate()関数で区切りが明記されている1つの変数の値を2つの変数に分割する

こちらはseparate()関数を使う。先ほど作ったdat2データに適用してみる。

dat2 %>% separate(name, c("family","first"))
# A tibble: 9 × 2
  family  first
*  <chr>  <chr>
1   高海   千歌
2   桜内   梨子
3   松浦   果南
4   黒澤 ダイヤ
5   渡辺     曜
6   津島   善子
7 国木田   花丸
8   小原   鞠莉
9   黒澤 ルビィ