Qiita Conference 2025

tenntenn (@tenntenn)

好奇心を原動力に行動するソフトウェアエンジニアになるために

1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Qiita Conference 2025 will be held!: 4/23(wed) - 4/25(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

ymrl、Masanobu Naruse, Takeshi Kano, Junichi Ito, uhyo, Hiroshi Tokumaru, MinoDriven, Minorun, Hiroyuki Sakuraba, tenntenn, drken, konifar

View event details
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?