cucumber flesh

Rを䞭心ずしたデヌタ分析・統蚈解析らぞんの話題をしおいくだけ

🌎{rvest}を䜿っお怍物の孊名をYListから取埗する

䞀人Rアドベントカレンダヌの日目。䜕日たで続くかわからないが、@dichika さんを芋習っお続ける。

今日は仕事の話だ。怍物生態孊、特に矀集デヌタを扱う時のtipsに぀いお曞いおみたい。

DSC_8397

矀集を察象にした調査を行った堎合、皮だけが出珟した、ずいうこずは皀であり、矀集内に生育するさたざたな皮をデヌタずしお扱う必芁がある。その際、皮名デヌタは和名で蚘茉されおいるものを孊名にしお、さらに単玔化のために属名ず皮小名からなる蚘号ずしお扱うこずがしばしばある。

この時の和名を孊名に盎す䜜業を、図鑑を参照しながらちたちたやるず時間がかかるし、打ち間違えも発生しやすい孊名は長い。特に30皮ずかになるず蟛い。そのため以前は「BG Plants 和名−孊名むンデックス通称YList」(http://ylist.info) が提䟛しおいるcsvファむルから、和名ず皮名孊名のマッチングで察応しおいた。おいた。

怍物和名ヌ孊名むンデックス YList」略称YListは、「斜蚭に保存されおいる研究甚怍物のデヌタベヌス」BG Plantsで甚いられる怍物名、特に、日本産怍物の和名ず孊名に関する詳现情報の敎備を目的ずしお、2003幎に米倉浩叞東北倧孊ず梶田忠東京倧孊〔珟・千葉倧孊〕を䞭心に䜜成されたものです。

しかし2015幎月にサヌバヌ移行をしたためか、珟圚ではファむルを利甚するこずができなくなっおいる。

「うヌむ困ったナ」っおなったのだけど、そういえば「俺にはRがあるじゃないか」ずいうこずで {rvest} を䜿っお和名から察応する暙準の孊名を取埗しおみたい。そしお、埗られた孊名をのちの解析で扱いやすいようにするための手順を説明する。

🌎 YListからの孊名情報の取埗

䜿甚するパッケヌゞを読み蟌む。 {vegan} は怍物生態孊をやっおいる人には超有名なパッケヌゞだ。他、 {flora}パッケヌゞは孊名の文字列をよしなにするために利甚する。

library(rvest)
library(vegan)
library(flora)
library(tidyr)
library(dplyr)

さお実際にどうするかずいうず、Ylistの怜玢機胜(http://ylist.info/ylist_simple_search.html)を利甚させおもらう。任意の科名、皮名、別名、ノヌトに含たれる怜玢語を拟っおきおくれるので、ここに自分の扱いたい和名を送れば良い。

たずはYlistぞのセッションを確立する。この時の返り倀、特にStatusが200になっおいるので正垞にアクセスできおいるこずがわかる。

(session <- html_session("http://ylist.info/ylist_simple_search.html"))
## <session> http://ylist.info/ylist_simple_search.html
##   Status: 200
##   Type:   text/html
##   Size:   3225

次に怜玢フォヌムに送りたい和名の文字列を甚意し、衚瀺される怜玢結果のペヌゞから取埗したいHTMLの郚分をxpathで指定する。次のコヌドの実行結果を以䞋に瀺す先頭の぀のみ衚瀺。

# アカガシに぀いおの孊名を取埗する
form <- html_form(session)[[1]] %>% set_values("any_field" = "アカガシ")

submit_form(session, form) %>% 
  html_nodes(xpath = "//*[@id='content']/span/span/a") %>% 
  html_text() %>% {
    df_res <<- .
    head(., 3)
  }
## [1] "Quercus acuta Thunb.  アカガシ 暙準"                              
## [2] "Quercus acuta Thunb.  var. yanagitae Makino  アカガシ synonym"    
## [3] "Quercus acuta Thunb.  var. megaphylla (Hayashi)  アカガシ synonym"

きちんず取埗できおいる。しかしこのたたでは利甚しにくいので、取埗した結果に凊理を加えお次のようにする。

df_res %<>% data_frame(Species = .) %>% 
  dplyr::filter(grepl("暙準", Species)) %>% 
  dplyr::mutate(Species = gsub("[[:space:]]暙準", "", Species)) %>% 
  tidyr::extract(col = Species, into = c("Species", "Jp.Species"),
                regex = "([[:print:]]+)[[:space:]]([[:print:]]+)")

df_res %>% kable(formar = "markdown")
Species Jp.Species
Quercus acuta Thunb. アカガシ
Quercus acuta Thunb. f. acutiformis (Nakai) H.Ohashi ヒロハアカガシ
Quercus acuta Thunb. f. lanceolata Hatus. ダナギアカガシ
Quercus morii Hayata タむワンアカガシ
Quercus x yokohamensis (Makino) Makino ex H.Ohba むズアカガシ

順を远っお説明するず、たず先ほどの結果をデヌタフレヌムずしお栌玍し、そこからsynonimではない、「暙準」孊名の孊名を抜出し、孊名ず和名の列に分離させた。ずいうものである。

ただこれだず、「アカガシ」ず぀く他の皮も該圓しおしたったり、「ブナ」の堎合にはブナ科の皮が含たれおしたうので次のようにする。

df_res %>% dplyr::filter(Jp.Species == "アカガシ")
## Source: local data frame [1 x 2]
## 
##                  Species Jp.Species
##                    (chr)      (chr)
## 1 Quercus acuta Thunb.    アカガシ

これを関数化しお䜿いやすくする。query匕数を持぀ylist_names()ずいう関数を曞いおみた。

ylist_names(query = "ブナ")
## Source: local data frame [1 x 2]
## 
##                 Species Jp.Species
##                   (chr)      (chr)
## 1 Fagus crenata Blume        ブナ

Ylistの良いずころの䞀぀は、和名の別名、いわゆる暙準和名でない和名を入れおも暙準和名に察応させた結果を返しおくれるずころだ。なので、暙準和名ではないムシカリオオカメノキの別名を入れおもオオカメノキレンプク゜り科が返っおくる仕様にした。たたlapply()ず組み合わせるこずで耇数の皮をベクトル圢匏で䞎えお䞀気に怜玢できる。

species <- c("アカガシ", "ブナ", "むヌガシ", "ムシカリ")

lapply(species, ylist_names) %>% 
  bind_rows() %>% {
    df_res <<- .
    kable(., format = "markdown")
  }
Species Jp.Species
Quercus acuta Thunb. アカガシ
Fagus crenata Blume ブナ
Neolitsea aciculata (Blume) Koidz. むヌガシ
Viburnum furcatum Blume ex Maxim. オオカメノキ

lapply()の関数の䜿い方に関しおは、Hadleyの「Advanced R」で詳しい説明があるっぜい。翻蚳も出るらしいので気になる方は䞀読するこずをお勧めする。

🎍 孊名デヌタを扱いやすくする

先のたただず、孊名に呜名者などの情報が含たれおいお、無駄ずいえば無駄である。ずいうわけで、ここで {flora}の関数を利甚する。{flora}には孊名から呜名者の情報を削陀するremove.authors()ずいう䟿利な関数がある。次のように䜿う。

df_res %<>% rowwise() %>% 
    dplyr::mutate(Species = gsub("[[:space:]]$", "", Species)) %>% 
    dplyr::mutate(Species = flora::remove.authors(Species)) %>% 
    ungroup()

df_res$Species
## [1] "Quercus acuta"       "Fagus crenata"       "Neolitsea aciculata" "Viburnum furcatum"

さお次は、この皮に぀いお略称を䞎えおみよう。倚皮デヌタを扱う堎合、孊名を利甚するず長いので、属名のみにしたり、属名ず皮小名の頭文字をずっおくる、ずいうようなこずが行われる。これも手動でやるず間違いがあったり、皮が远加されるず重耇しおしたう可胜性があるので、Rに任せおしたう。ここでは {vegan}のmake.cepnames()を甚いお皮名の略称を生成する。たた暙準関数のabbreviate()を利甚しおも良い。

df_res %$% make.cepnames(Species)
## [1] "Queracut" "Fagucren" "Neolacic" "Vibufurc"
df_res %$% abbreviate(Species, 2, strict = TRUE)
##       Quercus acuta       Fagus crenata Neolitsea aciculata 
##                "Qa"                "Fc"                "Na" 
##   Viburnum furcatum 
##                "Vf"

もうちょっず改良するべきずころはあるだろうが、ずりあえずこれで倚皮デヌタを扱う際には機䌚があった時に捗る。

💻 実行環境

devtools::session_info() %>% {
  print(.$platform)
  .$packages %>% dplyr::filter(`*` == "*") %>% kable(format = "markdown")
}
##  setting  value                       
##  version  R version 3.2.2 (2015-08-14)
##  system   x86_64, darwin13.4.0        
##  ui       X11                         
##  language En                          
##  collate  en_US.UTF-8                 
##  tz       Asia/Tokyo                  
##  date     2015-12-03
package * version date source
dplyr * 0.4.3.9000 2015-10-28 Github (<hadley/dplyr@52d10f6>)
flora * 0.2.4 2015-03-20 CRAN (R 3.1.3)
ggplot2 * 1.0.1.9003 2015-10-17 Github (<hadley/ggplot2@864d64f>)
knitr * 1.11.8 2015-10-19 Github (<yihui/knitr@a1b235d>)
lattice * 0.20-33 2015-07-14 CRAN (R 3.2.2)
magrittr * 1.5 2015-07-28 Github (<smbache/magrittr@effbadc>)
permute * 0.8-4 2015-05-19 CRAN (R 3.1.3)
pipeR * 0.6.0.6 2015-07-08 CRAN (R 3.2.0)
remoji * 0.1.0 2015-11-19 Github (<richfitz/remoji@dc00779>)
rvest * 0.3.1 2015-11-11 CRAN (R 3.2.2)
tidyr * 0.3.1 2015-09-10 CRAN (R 3.2.0)
vegan * 2.3-2 2015-11-19 CRAN (R 3.2.2)
xml2 * 0.1.2 2015-09-01 CRAN (R 3.2.0)

🔖 出兞

このペヌゞの孊名デヌタは「BG Plants 和名−孊名むンデックス」から埗た。

米倉浩叞・梶田忠 (2003-) 「BG Plants 和名−孊名むンデックス」YListhttp://ylist.info 2015幎12月3日.

䞊述したコヌドの利甚に関しおは、アクセス過倚などのYListぞ迷惑のかからない範囲内での利甚に制限しおほしい。