新型肺炎COVID-19 の集中治療学会のデータを引っこ抜く

こんなデータがある。
covid19.jsicm.org
COVID-19による全国の人工呼吸器患者数とECMO稼働数(と離脱者数、死亡者数、現在も治療されている最中の数)がjsでグリグリできる。
グリグリできるのはいいが、47都道府県+地方別とデータを取るのが面倒なので、引っこ抜いた。

ページが更新されるたびにhtmlをローカルに保存して、COVID-19 重症患者状況_files のなかのJSONが記述されているjs(5月5日は 0a923574fbb3da6cc56.js だった)を読み込んでゴリ押しする。

人工呼吸器の都道府県および地方別のgooglevis も置いておく。



無駄な努力、ご苦労様(ヒソカ

library(stringr)
dlevel <- function(z) as.numeric(as.character(z))
l <- readLines("COVID-19 重症患者状況_files/40a923574fbb3da6cc56.js")
l0 <- str_extract_all(gsub('\"', "", l), "JSON.parse\\(.+?\\)")[[1]]

# 地方区分
dist <- cbind.data.frame(a=str_extract_all(l0[1], "a\\d")[[1]],
dist=c(str_remove_all(str_extract_all(l0[1], "a\\d:.+?,")[[1]], "[a|\\d|,|:]"), "九州"))
dist <- apply(dist, 2, as.character)

# ECMO 転帰
l3 <- gsub("\\}", ",", str_extract_all(l0[3], "date.+?\\}")[[1]])
l33 <- mapply(function(z) do.call(rbind.data.frame, strsplit(strsplit(z, ",")[[1]], ":")), l3, SIMPLIFY=FALSE)
l333 <- as.data.frame(t(mapply(function(z) z[,2], l33, USE.NAMES=FALSE)))
l333[,-1] <- apply(l333[,-1], 2, dlevel)
l333 <- data.frame(date=l333[,1], "実施中"=l333[,2], "死亡"=l333[,3], "離脱"=as.numeric(as.character(l333$V6))+as.numeric(as.character(l333$V7)))

# 都道府県
l4 <- gsub("data:\\{", "", gsub("\\}", ",", str_extract_all(l0[4], "data.+?\\}")[[1]]))
l44 <- mapply(function(z) do.call(rbind.data.frame, strsplit(strsplit(z, ",")[[1]], ":")), l4, SIMPLIFY=FALSE, USE.NAMES=FALSE)[[1]]
l444 <- matrix(as.character(unlist(l44)), nc=2)

# ECMO 装着数
l2 <- gsub("\\}", ",", str_extract_all(l0[2], "date.+?\\}")[[1]])
l22 <- mapply(function(z) do.call(rbind.data.frame, strsplit(strsplit(z, ",")[[1]], ":")), l2, SIMPLIFY=FALSE)
l222 <- as.data.frame(t(mapply(function(z) z[,2], l22, USE.NAMES=FALSE)))
colnames(l222) <- l22[[1]][,1]
colnames(l222)[match(c(l444[,1], dist[,1]), colnames(l222))] <- c(l444[,2], dist[,2])
l222[,-1] <- apply(l222[,-1], 2, dlevel)

# 人工呼吸器都道府県別
l5 <- gsub("\\}", ",", str_extract_all(l0[5], "date.+?\\}")[[1]])
l55 <- mapply(function(z) do.call(rbind.data.frame, strsplit(strsplit(z, ",")[[1]], ":")), l5, SIMPLIFY=FALSE)
l555 <- as.data.frame(t(mapply(function(z) z[,2], l55, USE.NAMES=FALSE)))
colnames(l555) <- l55[[1]][,1]
l555[,-1] <- apply(l555[,-1], 2, dlevel)
colnames(l555)[match(c(l444[,1], dist[,1]), colnames(l555))] <- c(l444[,2], dist[,2])
library(googleVis)
library(stringr)
gmat <- l555[,1:48]
# gmat$date <- seq(gmat$date)
# gmat$date <- as.Date(as.character(gmat$date))
url <- "https://covid19.jsicm.org/"
webpage <- "COVID-19 重症患者状況 日本COVID-19対策ECMOnet集計"
headertxt <- sprintf("<span><a href='%s' target='_blank'>%s</a></span> on %s", url, webpage, Sys.Date())
# googlevis 用のプロットオプション
ops <- list(
  fontSize=12, height=400, width=400, lineWidth=1,
  vAxis="{title:'人数', fontSize: 20, titleTextStyle: {fontSize: 20, bold: 'true', italic: 'false'}, viewWindow: {min: 0, max: 100}, gridlines: {color: '#00F', minSpacing: 100}, logScale: 'false'}",
  sizeAxis="{minValue: -80, maxValue: 75, maxSize: 15}",
  hAxis="{title:'Date', fontSize: 20, titleTextStyle: {fontSize: 20, bold: 'true', italic: 'false'}, viewWindow: {min: 0, max: 81}}",
  explorer="{actions: ['dragToZoom', 'rightClickToReset']}",
  focusTarget="datum", # datum category
  selectionMode="single", # multiple
  legend="{position: 'right', textStyle: {color: 'black', fontSize: 10}, pageIndex: 1}"
)
gvis <- gvisLineChart(gmat, options=ops)
gvis$html$caption <- NULL
gvis$html$footer <- str_replace(gvis$html$footer,
                                "<span> \n  .+\n  .+\n</span>",
                                headertxt)
plot(gvis)


gmat <- l555[,c(1, 49:ncol(l555))]
# gmat$date <- seq(gmat$date)
# gmat$date <- as.Date(as.character(gmat$date))
url <- "https://covid19.jsicm.org/"
webpage <- "COVID-19 重症患者状況 日本COVID-19対策ECMOnet集計"
headertxt <- sprintf("<span><a href='%s' target='_blank'>%s</a></span> on %s", url, webpage, Sys.Date())
# googlevis 用のプロットオプション
ops <- list(
  fontSize=12, height=400, width=400, lineWidth=1,
  vAxis="{title:'人数', fontSize: 20, titleTextStyle: {fontSize: 20, bold: 'true', italic: 'false'}, viewWindow: {min: 0, max: 320}, gridlines: {color: '#00F', minSpacing: 100}, logScale: 'false'}",
  sizeAxis="{minValue: -80, maxValue: 75, maxSize: 15}",
  hAxis="{title:'Date', fontSize: 20, titleTextStyle: {fontSize: 20, bold: 'true', italic: 'false'}, viewWindow: {min: 0, max: 81}}",
  explorer="{actions: ['dragToZoom', 'rightClickToReset']}",
  focusTarget="category", # datum category
  selectionMode="single", # multiple
  legend="{position: 'right', textStyle: {color: 'black', fontSize: 10}, pageIndex: 1}"
)
gvis <- gvisLineChart(gmat, options=ops)
gvis$html$caption <- NULL
gvis$html$footer <- str_replace(gvis$html$footer,
                                "<span> \n  .+\n  .+\n</span>",
                                headertxt)
plot(gvis)