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] #&#34892;&#21517;&#12398;&#21462;&#24471;&#12289;&#12450;&#12531;&#12480;&#12540;&#12496;&#12540;&#12391;&#35672;&#21029;
StartCol <- (which( duplicated(CNAnaData) == TRUE, arr.ind = TRUE)[1]) - 1 #&#38283;&#22987;&#34892;&#12398;&#21462;&#24471;
RangeCol <- unique(rle(CNAnaData)[[1]][rle(CNAnaData)[[1]] != 1]) #&#32066;&#20102;&#34892;&#12398;&#21462;&#24471;
LabName <- unique(CNAnaData) #&#12521;&#12505;&#12523;&#12398;&#35373;&#23450;
########

###&#32368;&#12426;&#36820;&#12375;&#20966;&#29702;&#12505;&#12463;&#12488;&#12523;&#12398;&#35373;&#23450;########
StartColSelect <- seq(StartCol, (ncol(SampleData)), by = RangeCol) #&#23455;&#28204;&#38283;&#22987;&#12505;&#12463;&#12488;&#12523;&#12398;&#20316;&#25104;
EndColSelect <- seq(StartCol + (RangeCol - 1), (ncol(SampleData)), by = RangeCol) #&#23455;&#28204;&#32066;&#20102;&#12505;&#12463;&#12488;&#12523;&#12398;&#20316;&#25104;
########

参考例:項目名毎にBoxPlotをプロットするコード

以下のコードを実行することで項目名毎にBoxPlotがプロットされます。
melt関数でIDを指定していないので「Using as id variables」が表示されますが問題ありません。

library("ggplot2")
library("grid") #&#12524;&#12452;&#12450;&#12454;&#12488;&#12398;&#35519;&#25972;&#12395;&#24517;&#35201;
library("reshape") #melt&#38306;&#25968;&#12398;&#21033;&#29992;&#12395;&#24517;&#35201;

###&#12469;&#12531;&#12503;&#12523;&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;#####
Item <- 4 #&#38917;&#30446;&#25968;&#12398;&#35373;&#23450;&#12289;&#12392;&#12426;&#12354;&#12360;&#12378;4&#38917;&#30446;
Rep <- 4 #&#38917;&#30446;&#12372;&#12392;&#12398;&#32368;&#12426;&#36820;&#12375;&#25968;&#12289;&#12392;&#12426;&#12354;&#12360;&#12378;4&#22238;
DataVol <- 100 #&#21015;&#25968;&#12398;&#35373;&#23450;&#12289;&#12392;&#12426;&#12354;&#12360;&#12378;100&#20491;  
ColNames <- NULL

#&#34892;&#21517;&#12398;&#20316;&#25104;
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)) #&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;
colnames(SampleData) <- ColNames #&#34892;&#21517;&#12398;&#35373;&#23450;
########

###&#32368;&#12426;&#36820;&#12375;&#20966;&#29702;&#12392;&#12521;&#12505;&#12523;&#12505;&#12463;&#12488;&#12523;&#20316;&#25104;&#12398;&#28310;&#20633;########
CNAnaData <- t(as.data.frame(strsplit(colnames(SampleData),"_")))[, 1] #&#34892;&#21517;&#12398;&#21462;&#24471;&#12289;&#12450;&#12531;&#12480;&#12540;&#12496;&#12540;&#12391;&#35672;&#21029;
StartCol <- (which( duplicated(CNAnaData) == TRUE, arr.ind = TRUE)[1]) - 1 #&#38283;&#22987;&#34892;&#12398;&#21462;&#24471;
RangeCol <- unique(rle(CNAnaData)[[1]][rle(CNAnaData)[[1]] != 1]) #&#32066;&#20102;&#34892;&#12398;&#21462;&#24471;
LabName <- unique(CNAnaData) #&#12521;&#12505;&#12523;&#12398;&#35373;&#23450;
########

###&#32368;&#12426;&#36820;&#12375;&#20966;&#29702;&#12505;&#12463;&#12488;&#12523;&#12398;&#35373;&#23450;########
StartColSelect <- seq(StartCol, (ncol(SampleData)), by = RangeCol) #&#23455;&#28204;&#38283;&#22987;&#12505;&#12463;&#12488;&#12523;&#12398;&#20316;&#25104;
EndColSelect <- seq(StartCol + (RangeCol - 1), (ncol(SampleData)), by = RangeCol) #&#23455;&#28204;&#32066;&#20102;&#12505;&#12463;&#12488;&#12523;&#12398;&#20316;&#25104;
########

###&#12524;&#12452;&#12450;&#12454;&#12488;&#12398;&#35373;&#23450;#####
grid.newpage()
gl <- grid.layout(nrow = 1, ncol = 4) #&#12524;&#12452;&#12450;&#12454;&#12488;&#12434;1*4&#12391;&#20998;&#21106;
pushViewport(viewport(layout=gl)) 
#grid.show.layout(gl) #&#12524;&#12452;&#12450;&#12454;&#12488;&#12398;&#30906;&#35469;
########

###&#32368;&#12426;&#36820;&#12375;&#20966;&#29702;&#12505;&#12463;&#12488;&#12523;&#12391;&#32368;&#12426;&#36820;&#12375;&#12503;&#12525;&#12483;&#12488;#####

for(n in seq(StartColSelect)){
  
  meltAnaData <- melt(SampleData[, StartColSelect[n]:EndColSelect[n]])  
  
  ###ggplot2&#12391;&#12503;&#12525;&#12483;&#12488;#####
  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("&#38917;&#30446;_", LabName[n], sep = ""), y = "") 
  
  print(PlotData, vp = viewport(layout.pos.col = n))
}

コード実行後に出力されるプロット

データ作成にはrnormを使用しているので、データは毎回変わります。


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

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