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

いずにゃんの研究日記

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

はじめての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!

因子型(factor型)の水準操作が便利になるforcatsパッケージ

カテゴリ変数を扱う際に,因子型(factor型)の理解が必要になるが,最初は扱いに苦労する。しかし,それを解決するパッケージがあるらしい。

{forcats}パッケージでカテゴリカル変数(factor型データ)をいじってみる

これは便利!ということで,おなじみのラブライブ!サンシャイン!!のデータを使って試してみた。今回はトリオユニット名のデータを使用してみる。

dat_tu <-
  data.frame(
    name=c("高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子",
           "国木田花丸","小原鞠莉","黒澤ルビィ"),
    group=c("CYaRon!","Guilty Kiss","AZALEA","AZALEA","CYaRon!","Guilty Kiss",
            "AZALEA","Guilty Kiss","CYaRon!") #トリオユニット名
  )

library(tidyverse)
dat_tu <- tbl_df(dat_tu)
dat_tu
# A tibble: 9 × 2
        name       group
      <fctr>      <fctr>
1   高海千歌    CYaRon!
2   桜内梨子 Guilty Kiss
3   松浦果南      AZALEA
4 黒澤ダイヤ      AZALEA
5     渡辺曜    CYaRon!
6   津島善子 Guilty Kiss
7 国木田花丸      AZALEA
8   小原鞠莉 Guilty Kiss
9 黒澤ルビィ    CYaRon!

(2017/02/15修正) tbl_df()関数を使ってtibble形式にすると,data.frameでそのまま読みこんだので文字データが自動的に<fctr>,つまり因子型になっていた。変数nameも因子型になっているのは問題かもしれないが,このデータ数なのでとりあえずよしとする。因子型にしたくない場合は,引数にstringsAsFactors = FALSEといれればよい。ちなみに,data_frame()関数でtibble形式にすると,文字型<chr>のままで読み込まれる。

dat_tu$group
[1] CYaRon!    Guilty Kiss AZALEA      AZALEA      CYaRon!    Guilty Kiss AZALEA      Guilty Kiss
[9] CYaRon!   
Levels: AZALEA CYaRon! Guilty Kiss

Levels: にあるとおり,水準の順番はアルファベット順になっている。つまり,1=AZALEA, 2=CYaRon!, 3=Guilty Kissという対応関係である。これはunclass()で確認できる。

unclass(dat_tu$group)
[1] 2 3 1 1 2 3 1 3 2
attr(,"levels")
[1] "AZALEA"      "CYaRon!"    "Guilty Kiss"


水準を指定して並び変える

それではforcatsを使用してみる。まずは,fct_relevel()関数を使用して,ユニット名の水準をCDリリース順に並び変えてみる。この先もその順番を基本とする。

library(forcats)
dat_tu$group <- fct_relevel(dat_tu$group, "CYaRon!")
dat_tu$group
[1] CYaRon!    Guilty Kiss AZALEA      AZALEA      CYaRon!    Guilty Kiss AZALEA      Guilty Kiss
[9] CYaRon!   
Levels: CYaRon! AZALEA Guilty Kiss

いまの順番からだと,CYaRon!が一番最初に移動すれば解決するので,引数に指定するのはそれだけである。自分の指定したい順にするには,それぞれ水準名を追加していけばよい。たとえば,

fct_relevel(dat_tu$group, "Guilty Kiss", "AZALEA")
[1] CYaRon!    Guilty Kiss AZALEA      AZALEA      CYaRon!    Guilty Kiss AZALEA      Guilty Kiss
[9] CYaRon!   
Levels: Guilty Kiss AZALEA CYaRon!


水準の順番を逆にする

これにはfct_rev()関数を使う。現在の並びはLevels: CYaRon! AZALEA Guilty Kissであるから,逆順にすると最初と最後が入れ替わるだけである。

fct_rev(dat_tu$group)
[1] CYaRon!    Guilty Kiss AZALEA      AZALEA      CYaRon!    Guilty Kiss AZALEA      Guilty Kiss
[9] CYaRon!   
Levels: Guilty Kiss AZALEA CYaRon!


日本語を試してみる

水準が多いと複雑になるので,1年生の名前だけで試してみる。まずは公式サイトプロフィール出現順にデータを入力してみる。

first <- factor(c("津島善子", "国木田花丸", "黒澤ルビィ"))
first
[1] 津島善子   国木田花丸 黒澤ルビィ
Levels: 国木田花丸 黒澤ルビィ 津島善子

水準の順番は,法則がよく分からないけど,とりあえず入力した順番と違うようだ。ここでforcatsの出番である。

fct_relevel(first, "津島善子")
[1] 津島善子   国木田花丸 黒澤ルビィ
Levels: 津島善子 国木田花丸 黒澤ルビィ

とりあえず問題なく動いてくれた。次は逆順にしてみる。順番は最初に作ったfirstの通りだから,花丸→ルビィ→善子の逆になるはず。

fct_rev(first)
[1] 津島善子   国木田花丸 黒澤ルビィ
Levels: 津島善子 黒澤ルビィ 国木田花丸

こちらも問題ない。

RでAnime APIから季節のアニメ情報を読み込んで一覧できるデータフレームにする

3か月ごとに,アニメの新番組チェックが忙しくなる時期がやってくる。 こんなとき,放映されるアニメ番組一覧の情報を手軽に作成できたら便利である。 それがRでできたらさらに心健やかになるに違いない。

アニメ番組一覧の情報について,アニメとITの融合「Anitech」を 促進している秋葉原IT戦略研究所さまがとても素晴らしい 仕組みを提供している。

qiita.com

これにアクセスすれば,JSON形式で様々なアニメ番組情報が取得できる。 以下,Rでどうやって行うかを解説する。なお,R Studioを使用している。


RからAnime APIを呼び出す

library(RCurl)

getURL()関数で読み込む先のURLを指定する。 ここでは,2017年の冬アニメを指定しているので,URLの末尾が/2017/1となっている。ここの西暦(2014年以降)と最後の番号(1~4)を変えれば,他の季節のアニメ情報も取得できる。

getdata.json <- getURL('http://api.moemoe.tokyo/anime/v1/master/2017/1')

これでJSON形式の情報はRに読み込めた。しかし,Rでこれを閲覧するためには,まずJSON形式からlist形式に変換する必要がある。そこで登場するのが次のパッケージである。

library(rjson)

変換は次のコードの通りである。

getdata.list <- fromJSON(getdata.json)

少し出力が長くなってしまうがstr()を使うとどういうデータが 読み込まれているのか,listの構造を把握できる。

str(getdata.list)

最初の1作品の結果を示すと,

List of 40
 $ :List of 15
  ..$ title_short2    : chr ""
  ..$ twitter_account : chr "anime_aimaimi"
  ..$ public_url      : chr "http://www.dreamcreation.co.jp/aimaimi3/"
  ..$ title_short1    : chr "あいまいみ"
  ..$ sex             : num 0
  ..$ twitter_hash_tag: chr "あいまいみー"
  ..$ id              : num 475
  ..$ sequel          : num 3
  ..$ created_at      : chr "2017-01-03 01:10:03.0"
  ..$ city_name       : chr ""
  ..$ cours_id        : num 13
  ..$ title           : chr "ちょぼらうにょぽみ劇場第三幕 あいまいみー~Surgical Friends~"
  ..$ city_code       : num 0
  ..$ title_short3    : chr ""
  ..$ updated_at      : chr "2017-01-03 01:10:03.0"

のようになる。しかしこれでは少し中身が把握しづらい。 こんなときに便利なのが,listviewerパッケージである。

qiita.com

library(listviewer)
jsonedit(getdata.list)

と実行すると,以下のようにRstudio内で見やすい形式に中身を 確認して,listの構造も確認できる。

f:id:izunyan:20170108200619j:plain


listから必要なデータを抜き出して,データフレームにする

1つのアニメ作品に様々な情報が付与されているので,分かりやすくするためとりあえず,3つの変数(作品名,webサイトURL,twitterアカウント) として情報を抜き出してみる。これにはlapplyを使う。

Title <- as.character(lapply(getdata.list, '[[','title'))
Web <- as.character(lapply(getdata.list, '[[','public_url'))
Twitter <- as.character(lapply(getdata.list, '[[','twitter_account'))

ここの'[['というのが最初よく理解できないと思うが,詳しい説明は

複数の行列、データフレームからなるリストの各成分から特定要素を抽出する (from r-help, 2004.09.17)

などを参照すると分かるかもしれない。あとは,この3つの変数(ベクトル)をデータフレームにまとめるだけである。データ表示に便利なtibble形式にする。

library(dplyr)
dat <- data_frame(title=Title,web=Web,twitter=Twitter)
dat

f:id:izunyan:20170108200711j:plain

環境によっては長くなっている部分の変数名は省略されて表示されているかもしれないが,これで今季のアニメ視聴に役立つリストがデータフレームとして作成できた。あとはcsvで出力するなど好きなように使えばよい。


追記(2017/02/12)

申し遅れてしまったが,本記事のコードは以下の解説を大いに参考にさせていただいている。RESAS-APIについてもその内まとめてみたい。

qiita.com