Python版気象庁の二酸化炭素濃度データのR(tidyverse)版である。
library(tidyverse)
df = read_csv("co2_monthave_ryo.csv", locale=locale(encoding="CP932"))
これだけでは「年」の列の末尾に説明の文章が入ってしまう。そこでは「月」は NA になるので,drop_na(df, 月) で末尾が外せるが,数値であるべきところが文字列になるという問題が残る。
そこで,col_types="iidc" とすることにより,各列のデータ型をそれぞれinteger・integer・double・character(string)と指定すれば,これ以外の型の内容はすべて NA になる。
df = read_csv("co2_monthave_ryo.csv",
locale=locale(encoding="CP932"), col_types="iidc")
NA は描画されないので特に取り除く必要はないが,drop_na() で取り除くほうがわかりやすい。
df = drop_na(df, 年) t = as.Date(paste0(df[[1]], "-", df[[2]], "-15"))
as.Date() は as.POSIXct() でもよい。
# svg("co2_monthave_ryo.svg", width=7, height=5)
# par(mgp=c(2, 0.8, 0))
plot(t, df[[3]], type="l", xlab="year", ylab=expression(paste(CO[2], " (ppm)")))
# dev.off()
あるいは,時系列を表す ts クラスに変換するほうが扱いが楽かもしれない:
co2 = ts(df[[3]], c(1987,1), frequency=12) plot(co2)
これと,stl(Seasonal Decomposition of Time Series by Loess)で seasonal と trend に分解したときの trend とを重ね書きしたグラフを描く。欠測値は前後の平均とする。
# svg("co2_trend_ryo.svg", width=7, height=5)
# par(mgp=c(2, 0.8, 0))
plot(co2)
x = which(is.na(co2))
co2[x] = (co2[x-1] + co2[x+1]) / 2
points(stl(co2, "periodic")$time.series[,2], type="l")
# dev.off()
Last modified: