sf::read_sf()とrgdal::readOGR()とtmaptools::read_shp()の速度比較
Rでシェープファイルデータを読込むための関数でどれが一番速度が速いか比較する。
library(sf) library(tmaptools) library(rgdal) library(microbenchmark)
rfile <- system.file("shape/nc.shp", package="sf") microbenchmark(sf::read_sf(rfile), sf::st_read(rfile, quiet=T), rgdal::readOGR(rfile, verbose=F), tmaptools::read_shape(rfile), times=10)
Unit: milliseconds expr min lq mean sf::read_sf(rfile) 8.671537 8.976245 14.69445 sf::st_read(rfile, quiet = T) 6.392833 6.685836 15.94281 rgdal::readOGR(rfile, verbose = F) 567.662413 597.656352 691.19212 tmaptools::read_shape(rfile) 583.133058 596.592328 654.66730 median uq max neval cld 10.928342 14.948451 36.55517 10 a 6.852349 7.603736 54.89468 10 a 623.355303 678.476535 1090.38659 10 b 626.761277 651.405453 836.15833 10 b
ということでsf
パッケージ一択でした。
microbenchmark(read_sf(rfile), st_read(rfile, quiet=T, stringsAsFactors = F), times=20)
Unit: milliseconds expr min lq read_sf(rfile) 8.032669 8.185589 st_read(rfile, quiet = T, stringsAsFactors = F) 5.793233 5.904619 mean median uq max neval cld 8.703159 8.319064 9.221673 11.538136 20 b 6.202890 6.021859 6.422662 8.131218 20 a
毎回引数指定めんどくさいかもしれないが、大規模なデータを読み込む場合はst_read()
がよいみたい。
もっと早く読み込める関数があったら教えてください。
ついでにggplot()とtmap()の速度について比較してみる。
library(ggplot2) library(tmap)
nc <- st_read(rfile, quiet=T, stringsAsFactors = F) microbenchmark(ggplot(nc)+geom_sf(aes(fill=CNTY_)), tm_shape(nc)+tm_polygons(col="CNTY_"))
Unit: microseconds expr min lq mean ggplot(nc) + geom_sf(aes(fill = CNTY_)) 2419.920 2465.9850 2947.4016 tm_shape(nc) + tm_polygons(col = "CNTY_") 114.408 128.1895 214.9879 median uq max neval cld 2528.097 2605.502 24483.139 100 b 157.263 175.387 6131.546 100 a
ggplot2は使い慣れているから便利だけど、やはり描画速度に難があるみたい。 特に空間情報データの作図の際にはその傾向が強いと思う。