本文へスキップ
からだにいいもの

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を使用しているので、データは毎回変わります。

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

スポンサーリンク
Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.