行や列ごとの処理であればapplyやlapply、sapplyで処理できますが、データフレームの項目名で繰り返し処理をしたくなる時があります。
例えば、複数項目を時期を変えて複数回観測したデータなどです。
「項目X_1、項目X_2、項目X_3、項目Y_1、項目Y_2、項目Y_3・・・」
こんな、データを項目ごとに処理するコードの例をご紹介します。
コード実行に必要なパッケージの導入
下記コードを実行することで導入することができます。
install.packages(c("ggplot2", "grid", "reshape"))
項目ごとに処理するポイント
ポイントは次のコードになります。
SampleDataの形式はデータフレームです。SampleDataは必要に応じて変更してください。
###繰り返し処理とラベルベクトル作成の準備######## CNAnaData <- t(as.data.frame(strsplit(colnames(SampleData),"_")))[, 1] #行名の取得、アンダーバーで識別 StartCol <- (which( duplicated(CNAnaData) == TRUE, arr.ind = TRUE)[1]) - 1 #開始行の取得 RangeCol <- unique(rle(CNAnaData)[[1]][rle(CNAnaData)[[1]] != 1]) #終了行の取得 LabName <- unique(CNAnaData) #ラベルの設定 ######## ###繰り返し処理ベクトルの設定######## StartColSelect <- seq(StartCol, (ncol(SampleData)), by = RangeCol) #実測開始ベクトルの作成 EndColSelect <- seq(StartCol + (RangeCol - 1), (ncol(SampleData)), by = RangeCol) #実測終了ベクトルの作成 ########
参考例:項目名毎にBoxPlotをプロットするコード
以下のコードを実行することで項目名毎にBoxPlotがプロットされます。
melt関数でIDを指定していないので「Using as id variables」が表示されますが問題ありません。
library("ggplot2") library("grid") #レイアウトの調整に必要 library("reshape") #melt関数の利用に必要 ###サンプルデータの作成##### Item <- 4 #項目数の設定、とりあえず4項目 Rep <- 4 #項目ごとの繰り返し数、とりあえず4回 DataVol <- 100 #列数の設定、とりあえず100個 ColNames <- NULL #行名の作成 for (i in seq(Item)){ name <- paste(LETTERS[i], "_", 1:Rep, sep="") ColNames <- c(ColNames, name) } SampleData <- as.data.frame(matrix(rnorm(DataVol * Item * Rep), nr = DataVol, nc = Item * Rep)) #データの作成 colnames(SampleData) <- ColNames #行名の設定 ######## ###繰り返し処理とラベルベクトル作成の準備######## CNAnaData <- t(as.data.frame(strsplit(colnames(SampleData),"_")))[, 1] #行名の取得、アンダーバーで識別 StartCol <- (which( duplicated(CNAnaData) == TRUE, arr.ind = TRUE)[1]) - 1 #開始行の取得 RangeCol <- unique(rle(CNAnaData)[[1]][rle(CNAnaData)[[1]] != 1]) #終了行の取得 LabName <- unique(CNAnaData) #ラベルの設定 ######## ###繰り返し処理ベクトルの設定######## StartColSelect <- seq(StartCol, (ncol(SampleData)), by = RangeCol) #実測開始ベクトルの作成 EndColSelect <- seq(StartCol + (RangeCol - 1), (ncol(SampleData)), by = RangeCol) #実測終了ベクトルの作成 ######## ###レイアウトの設定##### grid.newpage() gl <- grid.layout(nrow = 1, ncol = 4) #レイアウトを1*4で分割 pushViewport(viewport(layout=gl)) #grid.show.layout(gl) #レイアウトの確認 ######## ###繰り返し処理ベクトルで繰り返しプロット##### for(n in seq(StartColSelect)){ meltAnaData <- melt(SampleData[, StartColSelect[n]:EndColSelect[n]]) ###ggplot2でプロット##### plotdata <- ggplot(meltAnaData, aes(x = meltAnaData[, 1], y = meltAnaData[, 2], fill = meltAnaData[, 1])) PlotData <- plotdata + geom_boxplot(size = 0.1, show_guide = FALSE) + labs(x = paste("項目_", LabName[n], sep = ""), y = "") print(PlotData, vp = viewport(layout.pos.col = n)) }
コード実行後に出力されるプロット
データ作成にはrnormを使用しているので、データは毎回変わります。
少しでも、あなたの解析が楽になりますように!!