Rで解析:データフレームの項目名で処理を繰り返す

Rの解析に役に立つ記事

行や列ごとの処理であれば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を使用しているので、データは毎回変わります。


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました