読者です 読者をやめる 読者になる 読者になる

いずにゃんの研究日記

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

はじめてのggplot2(2):棒グラフを好みの色で描く

ggplot2の基本の構造等は前回の解説を参照。

izunyan.hatenablog.com

まずはいつものデータの読み込み。tidyverseをロードしておけば,ggplot2も読み込まれる。

library(tidyverse)
dat <-
  data_frame(
    name=c("高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子","国木田花丸","小原鞠莉","黒澤ルビィ"),
    grade=c(2,2,3,3,2,1,1,3,1), #学年
    height=c(157,160,162,162,157,156,152,163,154), #身長
    B=c(82,80,83,80,82,79,83,87,76), #バスト
    W=c(59,58,58,57,57,58,57,60,56), #ウエスト
    H=c(83,82,84,80,81,80,83,84,79)  #ヒップ
  )


Aqoursのメンバーごとの身長の棒グラフを描く

今回はx軸にメンバーの名前,y軸に身長がくるグラフにするので,geom_col()を使う。

ggplot(data = dat) +
  geom_col(mapping = aes(x = name, y = height))

f:id:izunyan:20170521174608j:plain


メンバーの並び順を変える

デフォルトのままだと,並び順に規則性がない感じなので,とりあえず公式webサイトでの紹介順に並び変えたい。並び方を指定するには,

izunyan.hatenablog.com

で紹介した通り,因子型が簡単なので,変数nameを因子型に変換する。ここでは新たな変数namefを作成してみる。

dat$namef <- factor(dat$name)

そして,指定した順に並び変える。

library(forcats)
dat$namef <- fct_relevel(dat$namef, "高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子","国木田花丸","小原鞠莉","黒澤ルビィ")
levels(dat$namef)
[1] "高海千歌"   "桜内梨子"   "松浦果南"   "黒澤ダイヤ" "渡辺曜"     "津島善子"   "国木田花丸" "小原鞠莉"   "黒澤ルビィ"


棒グラフを色で塗りつぶす

aes()の中にfill =を加え,x軸に指定した変数名を入れると着色される。後の追加編集のため,ここではpというオブジェクトに格納している。

p <- ggplot(data = dat) +
  geom_col(mapping = aes(x = namef, y = height, fill=namef))
p

f:id:izunyan:20170521194314j:plain

ただし,色がデフォルトのものであるため,ここは是非メンバーのイメージカラーで塗りつぶしてみたくなるのが自然な流れであろう。


各メンバーの棒グラフの色をそれぞれ指定する

Aqoursメンバーのイメージカラーについて,公式サイトのメンバー紹介ページ

www.lovelive-anime.jp

から,各シンボルマークで使われている色を使用する。この情報を取得する方法は色々あるが,今回はブラウザFirefox上で,スポイト機能を使って取得してみた。やり方は以下のリンク先を参照した。

daredemopc.blog51.fc2.com

結果,メンバーの紹介順に,左から

imagecol <- c("#FF791B","#FF7777","#00D29E","#F43232","#2AA4DB","#AEAEAE","#CFBA0F","#A530E0","#EE55B7")

という情報であることが分かった。ここでは後で使うため,imagecolというオブジェクトに格納した。

そして,グラフの色を手動で指定するために,scale_fill_manual()を使う。さきほど描いたグラフpに情報を追加するだけである。

p + scale_fill_manual(values = imagecol)

f:id:izunyan:20170521174610j:plain

これで直感的にグラフを解釈しやすくなった!

はじめてのlubridate(1)日付データを扱う

日付データは,Rの基本的な関数だと初学者では扱うのがけっこう大変である。それを簡単にしてくれる,まじでラブリーなパッケージがlubridateだ。

単純なデータで練習するために,今や全国で大人気となったのっぽパンの,ラブライブ!サンシャイン!!とのコラボ商品「塩キャラメルのっぽ」味の累計売上情報を日付と共にグラフにし,それぞれどれだけの日数を要したか確認するまでを解説する。

沼津駅の改札を出てすぐの所にある売店でもこの通りの充実ぶり

f:id:izunyan:20170507000211j:plain

データの情報源は以下の通り。

静岡のご当地パン「のっぽパン」と「ラブライブ!サンシャイン!!」のコラボが決定! | 株式会社バンデロール

のっぽ×ラブライブ!サンシャイン!! コラボパンの累計販売数が10万本突破! | 株式会社バンデロール

twitter.com


データを読み込む

library(tidyverse)
library(lubridate)

データの読み込みは,今後の情報追加時の更新作業が分かりやすい配置になるように,tribble()で実施してみる。

dat <- tribble(
  ~date,           ~hon,
  "2016/09/13",        0,
  "2016/11/09",   100000,
  "2017/04/15",   200000
)
dat

日付は文字型にしておく必要があるため," "で囲っている。データフレームを表示すると以下のような感じになる

# A tibble: 3 × 2
        date   hon
       <chr> <dbl>
1 2016/09/13 0e+00
2 2016/11/09 1e+05
3 2017/04/15 2e+05


日付変数に変換する

ここでlubridateの出番である。日付の情報が,year-month-dayの順番で並んでいるので,それぞれの頭文字をとった関数ymd()を使うだけでお手軽に変換できる。ここではdate2という変数を新たに作成した。

dat$date2 <- ymd(dat$date)
dat
# A tibble: 3 × 3
        date   hon      date2
       <chr> <dbl>     <date>
1 2016/09/13 0e+00 2016-09-13
2 2016/11/09 1e+05 2016-11-09
3 2017/04/15 2e+05 2017-04-15

このように,変数の型も<date>になった。

なお,ここの作業に関連する関数は他にもydm(),mdy(),myd(),dmy(),dym()があり,年月日がどんな順番でも対応可能なことが分かる。たとえば,

dmy("13/09/2016")
[1] "2016-09-13"

他にも,year-month-day hour-minute-secondに対応した,ymd_hms()などもあるが,今回は扱わない。

年月日の区切りは様々なタイプに対応しており,区切りなしや区切りが空白といった場合でも同様に読み込める。たとえば,

dmy("09 Nov 2016")
[1] "2016-11-09"

詳しくは,ymd()などのhelpのexample参照。


横軸が日付で縦軸が売上本数の線グラフを描く

p <- dat %>% 
  ggplot(aes(x = date2, y = hon)) +
  geom_line()
p

f:id:izunyan:20170507001119j:plain

横軸の月の部分があっさりすぎるのと,月の数字が3つしか表示されてないので,横軸を1カ月ごとの表示にしてみる

p + scale_x_date(date_breaks="1 month")

f:id:izunyan:20170507001125j:plain

文字が長くなるので,角度を45度にしてみる

p + scale_x_date(date_breaks="1 month") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

f:id:izunyan:20170507001131j:plain

さて,グラフを見ると最初の10万本達成までの伸びが急激で,その後20万本までは少し緩やかになった,ということが分かる。次は,時点間の日数が何日だったかについて確認してみる


時点間の日数を計算して変数にする

これは,date2の値について,前の行の値との差を計算すればよい。dplyrlag()関数が便利である。引数のdefault = date2[1]というのは,前の行がない1行目の結果をどうするかの指定で,デフォルトではNAを返すが,ここでは同じ1行目を指定しているので,0が返ってくる。

dat <- dat %>%
  mutate(date_dif = date2 - lag(date2, default = date2[1]))
dat
# A tibble: 3 × 4
        date   hon      date2 date_dif
       <chr> <dbl>     <date>   <time>
1 2016/09/13 0e+00 2016-09-13   0 days
2 2016/11/09 1e+05 2016-11-09  57 days
3 2017/04/15 2e+05 2017-04-15 157 days

最初の2か月だけでみると

> 100000/57
[1] 1754.386

なので,1日あたり1754本売れていたことになる。

はじめての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   黒澤 ルビィ

けものフレンズのTwitterアカウントフォロワー変動履歴をAnime APIから読み込んでグラフにしてみる

2月6日頃から,ネット上で「けものフレンズ」への関心が急激に高まっていたようである。下図はGoogleトレンドのグラフであるが,2月9日を100とした場合に,2月5日に9だった指標が,6日に35,2月8日に90,といった具合に変化していた。

f:id:izunyan:20170211230719j:plain

公式Twitterアカウントのフォロワー数もこれに連動していると考えられる。本記事では,Rでデータを取得し,ggplot2パッケージを使って「けものフレンズ」Twitterアカウントフォロワー数の推移をグラフに表してみたいと思う。


すごーい!

以前の記事

izunyan.hatenablog.com

で紹介したAnime APIでは,アニメ作品のTwitterアカウントのフォロワー数の履歴といった貴重なデータを取得することができる。すごーい!

qiita.com


わーい!

まずは使用するパッケージを読み込む

library(tidyverse) #あとで使うdplyrもggplot2もこれをロードしておけばOK
library(RCurl)
library(rjson)


Anime APIからデータを読み込む

これは次のコードだけである。

kemono <- getURL('http://api.moemoe.tokyo/anime/v1/twitter/follower/history?account=kemo_anime') #&end_date=1486740607

URLの?account=以下のkemo_animeがけものフレンズのtwtterアカウントである。ここを他作品のものに変えれば,その作品のデータが取得できる。デフォルトだと,現在時刻から前の100件のデータが読み込まれる。コメントアウトされている#&end_date=というのは,後で解説する。


リスト形式に変換する

読みこまれたデータはjson形式であるため,Rで表示しやすくするために,リスト形式にする

kemono.list<-fromJSON(kemono)


データフレーム形式に変換する

なじみあるデータ構造にするために,情報を抜き出してまとめる

Date <- as.character(lapply(kemono.list, '[[','updated_at'))
Follower <- as.character(lapply(kemono.list, '[[','follower'))
dat_kemono <- data_frame(date=Date,follower=Follower)
dat_kemono

作成されたdat_kemonoは以下のような内容になる。

# A tibble: 100 × 2
         date follower
        <chr>    <chr>
1  1486740606    18411
2  1486738806    18370
3  1486737005    18313
4  1486735205    18250
5  1486733405    18202
6  1486731605    18142
7  1486729805    18077
8  1486728006    18019
9  1486726206    17953
10 1486724406    17911
# ... with 90 more rows

dateの列は,日付のUNIXタイムスタンプ(1970年1月1日午前0時0分0秒からの経過秒数)で,followerの列がフォロワー数を表している。


過去100件より前の履歴を取得する

kemono2 <- getURL('http://api.moemoe.tokyo/anime/v1/twitter/follower/history?account=kemo_anime&end_date=1486560610')
kemono.list2 <- fromJSON(kemono2)

履歴を取得するには,どの時点より前なのかの情報を&end_date=の部分に加える必要がある。履歴の更新は大体30分間隔で行われているようなので,60秒*30分*100行で,大体180,000の数字の違いを指定してやればよい 今回は,1行目のデータが1486740606だったので,これから180000を引いて,数秒増やした数字1486560610を指定した。

1486740606-180000
[1] 1486560606

後は,同様にデータフレーム形式にする。リスト形式でまとめた方が手順が少なくて済みそうだが,自分がまだ慣れてないのでこのやり方を紹介する。もしかしたら無駄が多い作業になっているかもしれない。

Date <- as.character(lapply(kemono.list2, '[[','updated_at'))
Follower <- as.character(lapply(kemono.list2, '[[','follower'))
dat_kemono2 <- data_frame(date=Date,follower=Follower)
dat_kemono2

後は同様の作業を繰り返して,集めたい期間の情報を取得してくるだけである。今回は, あと3回繰り返してdat_kemono5まで取得してみた。


データフレームを1つにつなげる

取得したデータはそれぞれ違う時間帯で,縦に長く連結するだけなので,dplyrパッケージのbind_rows()関数を使う。

dat_kemono_all <- bind_rows(dat_kemono, dat_kemono2, dat_kemono3, dat_kemono4, dat_kemono5)

これでデータセットが完成した。わーい!


たーのしーい!

さあ,いよいよグラフを描いていく。が,まずは準備。


date変数がUNIXタイムスタンプのままなので日付形式に変換しておく

これには大変便利なanytimeパッケージを使う。date変数が文字型なので,as.numeric()で数値にしてanytime()関数の中に放り込む。あとはタイムゾーンtz=を東京に指定する。

library(anytime)
dat_kemono_all$date2 <- anytime(as.numeric(dat_kemono_all$date), tz = "Asia/Tokyo")
# A tibble: 500 × 3
         date follower               date2
        <chr>    <dbl>              <dttm>
1  1486740606    18411 2017-02-11 00:30:06
2  1486738806    18370 2017-02-11 00:00:06
3  1486737005    18313 2017-02-10 23:30:05
4  1486735205    18250 2017-02-10 23:00:05
5  1486733405    18202 2017-02-10 22:30:05
6  1486731605    18142 2017-02-10 22:00:05
7  1486729805    18077 2017-02-10 21:30:05
8  1486728006    18019 2017-02-10 21:00:06
9  1486726206    17953 2017-02-10 20:30:06
10 1486724406    17911 2017-02-10 20:00:06
# ... with 490 more rows

このように,新しい変数date2を作成し,日付と時刻が示されるようになった。


折れ線グラフを描く

ついに今回やりたかった所にたどりついた。みゃみゃみゃみゃみゃみゃみゃみゃー

ggplot(data = dat_kemono_all) +
  geom_line(mapping = aes(x = date2, y = follower))

f:id:izunyan:20170212001330j:plain

こんな風に簡単に図が作成できた。これをみると,2月6日前でも徐々にフォロワー数が増加していたのだが,7日にかけて傾きが急に大きくなった様子が読み取れる。ちゃんと下地は形成されつつあったのだろう。この後の勢いが大きく,3日間でフォロワー数が倍増し,その後も増え続けている。たーのしーい!

日本語データの入ったcsvを読む込む(Windowsの場合)

今回はたぶんWindows限定の内容な気がする。RStudioはVersion 1.0.44を使用。


csvファイルを用意する

いつものように「ラブライブ!サンシャイン!!」から,スクールアイドルグループAqoursのメンバーのデータを使用する。

library(tidyverse)
dat <-
  data_frame(
    name=c("高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子","国木田花丸","小原鞠莉","黒澤ルビィ"),
    grade=c(2,2,3,3,2,1,1,3,1), #学年
    height=c(157,160,162,162,157,156,152,163,154), #身長
    B=c(82,80,83,80,82,79,83,87,76), #バスト
    W=c(59,58,58,57,57,58,57,60,56), #ウエスト
    H=c(83,82,84,80,81,80,83,84,79)  #ヒップ
  )

今回はこのデータをcsvファイルにエクスポートする。まずどこにファイルが出力されるか確認するために,現在の作業ディレクトリ(フォルダ)の確認をする。

getwd()

場所を変更したい場合は,以下のコードで指定できる。なおRStudioなら,Ctrl + Shift + Hのショートカットで同じことができる。

setwd(choose.dir()) 
#実行すると一見なにも起きてないようになるけど,画面下部のタスクバーに新しいプログラムが動作しているお知らせがでるので,それを開くと場所を指定できるはず。

次のコードでcsvファイルのエクスポート完了である。

write.csv(dat, "aqours.csv",row.names = FALSE)


csvファイルを読み込む

さて,それではRStudioの便利なImport Dataset機能を使ってcsvファイルを読み込んでみる。 詳しく知りたい方は↓を読むとしゅごいって思うに違いない。

qiita.com

下の図にあるように,Import DatasetのFrom CSVの部分をクリックすればよい

f:id:izunyan:20170205002020j:plain


csvファイルを開こうとしてみると,↓のような画面になる

f:id:izunyan:20170205002340j:plain


name変数の日本語が入ってるはずの列が意味不明な文字列に!

これは,実際にRの表示上もこのままなので,解析の際にとても困る。 じゃあどうしたらよいか,ということで色々ネット上で情報を探し見たら,解決法が見つかった。

demacassette2.hateblo.jp

つまり,Code Preview:の所に出てきたコードで,エンコードcp932に変更すればよい。 下図では,とりあえずEncodingをDefaultからUTF-8に変更し,コードプレビューに表示させ,そこに手動でcp932に置き換えてみている。

f:id:izunyan:20170205002607j:plain

下記のように,ファイルの場所の指定部分に加え,locale = locale(encoding = "cp932")という部分が追加されている。

aqours <- read_csv("ここにフォルダまでのパス/aqours.csv", 
    locale = locale(encoding = "cp932"))
aqours
# A tibble: 9 × 6
        name grade height     B     W     H
       <chr> <int>  <int> <int> <int> <int>
1   高海千歌     2    157    82    59    83
2   桜内梨子     2    160    80    58    82
3   松浦果南     3    162    83    58    84
4 黒澤ダイヤ     3    162    80    57    80
5     渡辺曜     2    157    82    57    81
6   津島善子     1    156    79    58    80
7 国木田花丸     1    152    83    57    83
8   小原鞠莉     3    163    87    60    84
9 黒澤ルビィ     1    154    76    56    79

この通り,ちゃんと読み込んで日本語を表示できた!

cp932というのは,Shift_JISの拡張版みたいなやつっぽい。だから,読み込むcsvファイルの文字エンコードShift_JISであることが前提になっているが,Windowsを使っていると多くの場合そうなっているのではないかと思う。

cp932はR Scriptを保存するときに出てくる,下の画面にも出てたことに気がついた。

f:id:izunyan:20170205010301j:plain

意味不明な記号数字・・・と思ってたデフォルトの指定はこのことだったのか!

ともあれ,これでやっとAqorsメンバーの名前が正常に読み込めた。

はじめてのggplot2(1):基本構造と散布図

タイトルはggplot2であるが,RStudioを起動したら迷わず,関連パッケージを一気に読み込んでくれるtidyverseパッケージをロードすればよい。

library(tidyverse)

いつものように「ラブライブ!サンシャイン!!」のスクールアイドルグループAqoursのメンバーのデータを使用する。

dat <-
  data_frame(
    name=c("高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子","国木田花丸","小原鞠莉","黒澤ルビィ"),
    grade=c(2,2,3,3,2,1,1,3,1), #学年
    height=c(157,160,162,162,157,156,152,163,154), #身長
    B=c(82,80,83,80,82,79,83,87,76), #バスト
    W=c(59,58,58,57,57,58,57,60,56), #ウエスト
    H=c(83,82,84,80,81,80,83,84,79)  #ヒップ
  )
dat

念のため,学年は因子型に変換しておく

dat$grade <- factor(dat$grade)


基本の構造

ggplot(data = dat) +
  geom_point(mapping = aes(x = height, y = B))

f:id:izunyan:20170129191703j:plain

大体身長とバストサイズが関連しているが,1名例外がいることが分かる。

まずggplot()で使うデータセットを指定し,geom_point()で点の散布図を描くという指定をしている。それぞれ情報を追加していく際に+でつなげるのが特徴である。geom_pointのpointの部分が変わると別の種類のグラフになる。aesとは,aesthetics(訳語は美学,美的感覚)のことで,視覚的な特性を定義する部分である。ここでは横軸をheight,縦軸をBと指定している。

上記コードの形が基本形だが,実際には色々省略可能であり,下記のように単純にできる。

ggplot(dat) +
  geom_point(aes(height, B))

や

ggplot(dat, aes(height, B)) +
  geom_point()

でも同じグラフが描ける。下のコードの方は,ggplot()の中にaesが入っている。


いろいろな散布図

散布図を学年で色分け

ggplot(data = dat) +
  geom_point(mapping = aes(x = height, y = B, color = grade))

f:id:izunyan:20170129191759j:plain

先ほどの点のプロットに,学年別に色を付けた。aes()の中の引数にcolor = gradeが追加されただけの操作である。それぞれのデータが学年とも関連している様子が読み取れる。


散布図を学年で記号分け

ggplot(data = dat) +
  geom_point(mapping = aes(x = height, y = B, shape = grade))

f:id:izunyan:20170129191812j:plain

色ではなくて記号で区別することもできる。こんどは,color =の所がshape =に変わっただけである。


テキストで散布図

ggplot(data = dat) +
  geom_text(mapping = aes(x = height, y = B, label = name))

f:id:izunyan:20170129191739j:plain

それぞれの点が誰のデータか把握するために,点を名前のデータで表示してみた。ここではいくつか変更点があり,geom_text()に変わっている点と,aes()の中の引数にlabel = nameが加わっている。

身長は最も低いのにバストサイズが中程度という,意図的な設定を感じざるを得ないキャラが,花丸ちゃんだということも判明する。あと,千歌ちゃんと曜ちゃんの身長とバストサイズが同じなので,文字が重なってしまっている。

はじめてのdplyr(4):キー変数で2つのデータを横に連結する

タイトルはdplyrであるが,RStudioを起動したら迷わず,関連パッケージを一気に読み込んでくれるtidyverseパッケージをロードすればよい。

library(tidyverse)


2つのデータの作成

過去の記事,

で紹介してきたデータセットは,Aqoursメンバーの名前という共通した変数nameがある。今回はnameをキー変数として,2つのデータを横に連結してみる。まずはデータを以下に再掲。

dat <-
  data_frame(
    name=c("高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子","国木田花丸","小原鞠莉","黒澤ルビィ"),
    grade=c(2,2,3,3,2,1,1,3,1), #学年
    height=c(157,160,162,162,157,156,152,163,154), #身長
    B=c(82,80,83,80,82,79,83,87,76), #バスト
    W=c(59,58,58,57,57,58,57,60,56), #ウエスト
    H=c(83,82,84,80,81,80,83,84,79)  #ヒップ
  )
dat
# A tibble: 9 × 6
        name grade height     B     W     H
       <chr> <dbl>  <dbl> <dbl> <dbl> <dbl>
1   高海千歌     2    157    82    59    83
2   桜内梨子     2    160    80    58    82
3   松浦果南     3    162    83    58    84
4 黒澤ダイヤ     3    162    80    57    80
5     渡辺曜     2    157    82    57    81
6   津島善子     1    156    79    58    80
7 国木田花丸     1    152    83    57    83
8   小原鞠莉     3    163    87    60    84
9 黒澤ルビィ     1    154    76    56    79

次はメンバーの名前とトリオユニット名のデータを作る。片方のデータにしかない行も追加して動きを確認してみたいため,2つ目のデータではAqoursメンバーに加えうちっちーも加えてみる。

dat_tu <-
  data_frame(
    name=c("高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子",
           "国木田花丸","小原鞠莉","黒澤ルビィ","うちっちー"),
    group=c("CYaRon!","Guilty Kiss","AZALEA","AZALEA","CYaRon!","Guilty Kiss",
            "AZALEA","Guilty Kiss","CYaRon!","solo") 
  )
dat_tu
# A tibble: 10 × 2
         name       group
        <chr>       <chr>
1    高海千歌    CYaRon!
2    桜内梨子 Guilty Kiss
3    松浦果南      AZALEA
4  黒澤ダイヤ      AZALEA
5      渡辺曜    CYaRon!
6    津島善子 Guilty Kiss
7  国木田花丸      AZALEA
8    小原鞠莉 Guilty Kiss
9  黒澤ルビィ    CYaRon!
10 うちっちー        solo


2つのデータの連結

それでは,名前を示している変数nameをキーとして,datデータにdat_tuの情報を横に連結してみる。datにない行もすべて追加するために,full_join()関数を使う。

dat_all <- full_join(dat,dat_tu,by="name")
dat_all
# A tibble: 10 × 7
         name grade height     B     W     H       group
        <chr> <dbl>  <dbl> <dbl> <dbl> <dbl>       <chr>
1    高海千歌     2    157    82    59    83    CYaRon!
2    桜内梨子     2    160    80    58    82 Guilty Kiss
3    松浦果南     3    162    83    58    84      AZALEA
4  黒澤ダイヤ     3    162    80    57    80      AZALEA
5      渡辺曜     2    157    82    57    81    CYaRon!
6    津島善子     1    156    79    58    80 Guilty Kiss
7  国木田花丸     1    152    83    57    83      AZALEA
8    小原鞠莉     3    163    87    60    84 Guilty Kiss
9  黒澤ルビィ     1    154    76    56    79    CYaRon!
10 うちっちー    NA     NA    NA    NA    NA        solo

一方,うちっちーはデータに謎が多すぎるから今回は連結しません,という場合はleft_join()関数を使って,datの方にある名前のみと連結させるとよい。

dat_aqours <- left_join(dat,dat_tu,by="name")
dat_aqours
# A tibble: 9 × 7
        name grade height     B     W     H       group
       <chr> <dbl>  <dbl> <dbl> <dbl> <dbl>       <chr>
1   高海千歌     2    157    82    59    83    CYaRon!
2   桜内梨子     2    160    80    58    82 Guilty Kiss
3   松浦果南     3    162    83    58    84      AZALEA
4 黒澤ダイヤ     3    162    80    57    80      AZALEA
5     渡辺曜     2    157    82    57    81    CYaRon!
6   津島善子     1    156    79    58    80 Guilty Kiss
7 国木田花丸     1    152    83    57    83      AZALEA
8   小原鞠莉     3    163    87    60    84 Guilty Kiss
9 黒澤ルビィ     1    154    76    56    79    CYaRon!