こんなデータがある。
covid19.jsicm.org
COVID-19による全国の人工呼吸器患者数とECMO稼働数(と離脱者数、死亡者数、現在も治療されている最中の数)がjsでグリグリできる。
グリグリできるのはいいが、47都道府県+地方別とデータを取るのが面倒なので、引っこ抜いた。
ページが更新されるたびにhtmlをローカルに保存して、COVID-19 重症患者状況_files のなかのJSONが記述されているjs(5月5日は 0a923574fbb3da6cc56.js だった)を読み込んでゴリ押しする。
人工呼吸器の都道府県および地方別のgooglevis も置いておく。
CSVデータは公開されてません。サイトからSources等見てみましたが数値データがそのまま入手はできなかったので、手作業でExcelに入力しました
— EARLの医学ツイート (@EARL_Med_Tw) May 3, 2020
無駄な努力、ご苦労様(ヒソカ風
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)