LoginSignup
1
1

More than 5 years have passed since last update.

勝手に添削:for関数を使った繰り返し処理によるヒストグラムの一括出力 #rstatsj

Last updated at Posted at 2015-07-13

#HiRoshimaR のこれだけど、

pforeach パッケージを使うとこんな風に書けます。(という宣伝)

R
# データ生成 -------------------------------------------------------------------
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() を持っているので、これを使えば簡単に書けます。

R
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")
  }
})

プロットの部分は関数化するともう少しわかりやすくなるかもしれません。

R
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!

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1