「read.csv」でなく「read_csv」で取得
「R言語」で英国(United Kingdom)のオープンデータを取得します。
使うデータは新型コロナウイルスの3回目のワクチン接種数(People who have received booster or 3rd dose vaccinations)のcsv。
日毎の数字と、その累計の数字を使った2本のグラフを重ね描きします。
まず、標準Rの「read.csv」を使用しましたが、以下のようなエラー。
パラメータを変え何パターンか試すなどしましたが、うまくいきませんでした。
ukv3 <- read.csv("https://coronavirus.data.gov.uk/api/v1/data?xxxxx.csv", header = T)
read.table(file = file, header = header, sep = sep, quote = quote, でエラー:
列名よりも列数のほうが多いです
「read_csv」に切り替えたらすぐに取得できました。
「readr」パッケージを使用
「read_csv」は、ファイルの読み込み・書き込み用パッケージ「readr」の関数です。
以下の設定で読み込みできました。
library(readr)
ukv3 <- read_csv("https://coronavirus.data.gov.uk/api/v1/data?xxxxx.csv")
head(ukv3)
# A tibble: 6 x 6
areaType areaName areaCode date newPeopleVaccinatedThi… cumPeopleVaccinatedThi…
<chr> <chr> <chr> <date> <dbl> <dbl>
1 overview United Ki… K020000… 2021-11-16 347557 13494890
2 overview United Ki… K020000… 2021-11-15 286582 13147333
3 overview United Ki… K020000… 2021-11-14 217349 12860751
4 overview United Ki… K020000… 2021-11-13 461985 12643402
5 overview United Ki… K020000… 2021-11-12 357774 12181417
6 overview United Ki… K020000… 2021-11-11 370989 11823643
データを確認
読み込んだデータを確認します。
「NA」値(欠損値)が入っているのを見つけました。
str(ukv3) #データの型を確認
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 48 obs. of 6 variables:
$ areaType : chr "overview" "overview" "overview" "overview" ...
$ areaName : chr "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
$ areaCode : chr "K02000001" "K02000001" "K02000001" "K02000001" ...
$ date : Date, format: "2021-11-16" "2021-11-15" ...
$ newPeopleVaccinatedThirdInjectionByPublishDate: num 347557 286582 217349 461985 357774 ...
$ cumPeopleVaccinatedThirdInjectionByPublishDate: num 13494890 13147333 12860751 12643402 12181417 ...
tail(ukv3)
# A tibble: 6 x 6
areaType areaName areaCode date newPeopleVaccinatedThi… cumPeopleVaccinatedThi…
<chr> <chr> <chr> <date> <dbl> <dbl>
1 overview United Ki… K020000… 2021-10-05 156100 1586070
2 overview United Ki… K020000… 2021-10-04 123877 1429970
3 overview United Ki… K020000… 2021-10-03 89518 1306093
4 overview United Ki… K020000… 2021-10-02 194461 1216575
5 overview United Ki… K020000… 2021-10-01 153912 1022114
6 overview United Ki… K020000… 2021-09-30 NA 868202
「NA」を削除
不具合が生じるかもしれないので、「NA」を含むレコードを削除します。
library(tidyr)
ukv3a <- ukv3 %>% drop_na() #欠損値を含むデータを削除
tail(ukv3a)
# A tibble: 6 x 6
areaType areaName areaCode date newPeopleVaccinatedThi… cumPeopleVaccinatedThi…
<chr> <chr> <chr> <date> <dbl> <dbl>
1 overview United Ki… K020000… 2021-10-06 162097 1748167
2 overview United Ki… K020000… 2021-10-05 156100 1586070
3 overview United Ki… K020000… 2021-10-04 123877 1429970
4 overview United Ki… K020000… 2021-10-03 89518 1306093
5 overview United Ki… K020000… 2021-10-02 194461 1216575
6 overview United Ki… K020000… 2021-10-01 153912 1022114
日付と、日毎の計測値の散布図を「plot」で足掻こうしとしましたが、エラーが出ました。
par(xaxt="n")
plot(ukv3a[,4], ukv3a[,5])
xy.coords(x, y, xlabel, ylabel, log) でエラー:
'x' and 'y' lengths differ
データフレーム 型に変換
「class」でデータ型を確認。
少しデータフレームと異なる形式のようです。
(tbl_dfは、データフレームのサブクラスで、振る舞いが異なるそうです)
データフレーム 型に変換して、plotを実行しました。
class(ukv3a)
[1] "tbl_df" "tbl" "data.frame"
ukv3b <- as.data.frame(ukv3a)
class(ukv3b)
[1] "data.frame"
plot(ukv3b[,4], ukv3b[,5])
# as.data.frameで変換しないでplotを実行すると以下のエラー
# xy.coords(x, y, xlabel, ylabel, log) でエラー:
# 'x' and 'y' lengths differ
x軸をYY月dd日に
plotでは、日付を寺家列データとして扱ってくれますが、上記のように日付らしい目盛り表記ではないので、「YY月dd日」」というスタイルに変えます。
まず、「par(xaxt="n")」を指定し、x軸目盛りを外した状態でグラフを描き直します。
x軸は後で描き足します。
dev.new() #新規描画ウインドウ
par(family="HiraKakuPro-W3")
par(xaxt="n")
plot(ukv3b[,4], ukv3b[,5])
「par(xaxt="s")」でx軸を追加できる状態にします。
「axis.Date」で日付型の目盛表記の体裁を決め、追記します。
par(xaxt="s")
axis.Date(
1,
at=seq(
min(ukv3b[,4]),
max(ukv3b[,4]),
"week"
),
format="%m月%d日"
)
# 描画位置:1 = 下 2 = 左 3 = 上 4 = 右
# at = seqでは最小値,最大値,目盛間隔
# formatで表示形式
x、y軸に指定ラベル付与
x軸とy軸のラベル(タイトル)を変更しておきます。
もう一度設を設定を変え、グラフを書き直します。
ラベルは「xlab」「ylab」で指定します。
dev.new()
par(family="HiraKakuPro-W3")
par(xaxt="n")
plot(
ukv3b[,4],
ukv3b[,5],
xlab="time",
ylab="value"
)
par(xaxt="s")
axis.Date(
1,
at=seq(
min(ukv3b[,4]),
max(ukv3b[,4]),
"week"
),
format="%m月%d日"
)
右側に第2y軸追加の準備
取得したデータには、「累計」の数値も収録されていました。
累計グラフを追加し、右側にそのy軸を追加します。
再度グラフを描き直します。
ただ、デフォルトでは、右側にメモリを追加するスペースがないので、「par(mar=***)」を使い、右側にも左側と同じスペースを空けます。
dev.new()
par(mar = c(5, 5, 3, 5)) #下、左、上、右の順
par(family="HiraKakuPro-W3")
par(xaxt="n")
plot(
ukv3b[,4], ukv3b[,5],
xlab="time", ylab="value",
type="b",
las = 2,
cex.axis = 0.6,
col = "blue",
lwd = 2
)
先ほどと同様に日付型目盛りをx軸に追加します。
par(xaxt="s", cex.axis=0.6)
axis.Date(
1,
at=seq(min(ukv3b[,4]),max(ukv3b[,4]),
"week"),
format="%m月%d日"
)
「text」で各プロットのデータラベル(数値)も記載しておきます。
text(
ukv3b[,4], ukv3b[,5],
as.character(ukv3b[,5]),
cex=0.6,
pos=3,
col="red"
)
第2y軸用グラフ描画
「par(new = T)」を実行し、plotで累計推移グラフを加えます。
par(new = T) #現在のplotに上描きの設定
plot(
ukv3b[,4], ukv3b[,6],
type = "l",
axes = FALSE, #目盛りを記載しない
xlab = "",
ylab = "", #軸タイトルも記載しない
col="grey",
lwd = 2
)
第2y軸目盛りを追加
「axis」を使い、第2y軸目盛りを描き足します。
axis(
4,
las = 2,
col="grey",
col.axis="grey"
)
# 目盛り追記:1は下,2は左,3は上,4は右
# 2軸目のラベル設定
mtext("cumPeopleVaccinatedThirdInjectionByPublishDate", #2軸目のラベル名
side = 4,
line = 4,
cex.axis = 0.6,
col="grey"
)
# side でラベル位置:。1は下,2は左,3は上,4は右
# lineでグラフのからの距離指定
何度も描き直しましたが、目的のグラフが作成できました。
y軸の目盛り数値を「e」(10のべき乗)を使わない型にしようと思ったり、グラフのプロットのラベルをコンマ入りの数字にしようと思ったりしたのですが、後で調べることにしました。
了