R
api
ydnjp

RでAPIデータを扱うときはrlistを使うとストレスフリー

More than 1 year has passed since last update.

こんな話があって、Yahoo提供の電力使用状況APIで遊ぶ - Qiitaこんな記事を書いた。のだけども、リストの操作に慣れていないせいもあってかなんか汚い。

というわけでR上でのリストオブジェクトの扱いをよしなにしてくれるrlistパッケージに触れてみた。

結論: rlistべんり・しゅごい。

rlist、いろいろ関数あって複雑だけど、基本的なところだけでも抑えておけば神に近づける気がする

というわけで上記のrpubs記事と同じことをrlistを使ってやってみる。

# 使用するパッケージ
library("rlist")
library("dplyr")
api.key <- APIキー
area <- c("hokkaido", "tohoku", "tokyo", "chubu", "kansai", "kyushu")

url <- paste("http://setsuden.yahooapis.jp/v1/Setsuden/latestPowerUsage?appid=", api.key, "&area=%s&output=json", sep = "") %>%
  sprintf(area) %>% 
  list.load("json") %>% 
  list.ungroup() # このへんがみそ
str(url) # ↓値は省略する
# List of 6
# $ ElectricPowerUsage:List of 5
# ..$ Area    : chr "hokkaido"
# ...
# $ ElectricPowerUsage:List of 5
# ..$ Area    : chr "tohoku"
# ... 以下略

rlistにある関数ではAPIにあるパラメータ名を直接扱えるのでストレスが軽減する。パラメータ名を知りたいときは

list.names(url$ElectricPowerUsage)
# [1] "Area"     "Usage"    "Capacity" "Date"     "Hour"    

要素を確認

list.table(url, Area)
# Area
# chubu hokkaido   kansai   kyushu   tohoku    tokyo 
# 1        1        1        1        1        1

各電力会社のデータはurl[[i]]に格納されており、次はこのリストからlist.mapv関数を使って値を取り出す。例によって、数値が文字列になっているのでtransform関数で型変換。data.frame関数で結合し、使用量 / 供給量の割合のusage.pctという列を新たに追加して、resというデータフレームを作成。

data.frame(area,
      usage    = list.mapv(url, Usage$`$`, use.names = FALSE), 
      capacity = list.mapv(url, Capacity$`$`, use.names = FALSE)) %>% 
  dplyr::mutate(usage.pct = usage / capacity * 100) -> res

可視化はrpubsと同じなので省略。水準を入れ替えたいときはres$area <- area %>% factor(area)を忘れずに。

参考