#HiRoshimaR のこれだけど、
pforeach パッケージを使うとこんな風に書けます。(という宣伝)
# データ生成 -------------------------------------------------------------------
v1 <- ordered(rep(1:4, c(40, 55, 30, 25)))
v2 <- rep(c("A", "B", "C"), c(45, 65, 40))
v3 <- rep(paste0("地区", 1:5), c(25, 25, 15, 50, 35))
dat <- cbind(iris, v1, v2, v3)
dat <- transform(dat, v2=as.character(v2), v3=as.character(v3))
head(dat)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species v1 v2 v3
1 5.1 3.5 1.4 0.2 setosa 1 A 地区1
2 4.9 3.0 1.4 0.2 setosa 1 A 地区1
3 4.7 3.2 1.3 0.2 setosa 1 A 地区1
4 4.6 3.1 1.5 0.2 setosa 1 A 地区1
5 5.0 3.6 1.4 0.2 setosa 1 A 地区1
6 5.4 3.9 1.7 0.4 setosa 1 A 地区1
R の for 文は、今回のようにただプロットしたいというだけで、結果を変数に残さなくていい場合に便利なんだけど、データフレームの列ごとに繰り返すというのを書くのはちょっとめんどくさい。
そこで、pforeach が使えます。
pforeach は並列処理用のパッケージですが、npforeach
関数を使うことで逐次実行もできます。
pforeach はデータフレームの列ごとや行ごとに繰り返しを行うのに便利な関数 cols()
と rows()
を持っているので、これを使えば簡単に書けます。
library(pforeach)
npforeach(col=cols(dat), name=colnames(dat), .final=invisible)({
if(is.character(col)) col <- as.factor(col) # character なら factor へ変換
if(is.factor(col)) { # factor なら棒グラフを描く
plot(col,
main = name,
cex.main = 3,
col = "black",
space = 0.3)
} else if(is.numeric(col)) { # numeric ならヒストグラムを描く
hist(col,
main = name,
cex.main = 3,
xlab = NULL,
ylab = NULL,
breaks = 20,
col = "grey")
}
})
プロットの部分は関数化するともう少しわかりやすくなるかもしれません。
library(pforeach)
plot_bar <- function(x, name) {
plot(x, main = name, cex.main = 3, col = "black", space = 0.3)
}
plot_hist <- function(x, name) {
hist(x, main = name, cex.main = 3, xlab = NULL, ylab = NULL,
breaks = 20, col = "grey")
}
npforeach(col=cols(dat), name=colnames(dat), .final=invisible)({
if(is.character(col)) col <- as.factor(col)
if(is.factor(col)) {
plot_bar(col, name)
} else if(is.numeric(col)) {
plot_hist(col, name)
}
})
というわけで、pforeach は並列化したいときだけでなく、普段のループを書くときにも便利に使えるということでした。
Enjoy!