5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-04

こんな話があって、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)を忘れずに。

参考

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?