質問: R言語を用いて、エクセルのデータを列ごとにオブジェクトに格納したいです。 この時、オブジェクト数をエクセルのデータの列数に応じて用意することができるようなプログラムを考えたいです。 以下の画像のようなデータがエクセルのブックに格納されています。(sam_data245.xlsx) ファイルの形式は.xlsx形式で、データはブック内sheet1に入っています。 1行目にはデータのラベル(データ名)、2行目以降にデータが入っています。 列数はデータの測定条件に、行数は各条件での測定回数に対応しています。 ![sam_data245.xlsx](https://i.stack.imgur.com/elEnB.png) 各データの分散分析をするために、以下のようなプログラムを書きました。 ``` #一元分散分析(対応なし) #dataに測定回数分の測定性能をまとめたデータを入れる data <- read.xlsx('D:/Rproject/bunsanbunseki/Data/sam_data245.xlsx') a1<- data$a1 #a1~a3は水準(level) a2<- data$a2 a3<- data$a3 bunsan1<- data.frame( A=factor(c(rep("a1",length(a1)),rep("a2",length(a2)),rep("a3",length(a3)))), y=c(a1,a2,a3) ) #データフレームbunsan1のA列が因子の水準に関する情報、y列がテストで得られた数値 #rep("a1",10)は文字列a1を10回生成するコマンド bunsan1 #bunsan1の表示 boxplot(y~A,data=bunsan1,range=0,col="lightblue") #箱ひげ図でデータの大まかな情報を確認 #boxplot(縦軸y~横軸A(オブジェクト),data,),外れ値なしrange=0 summary(aov(y~A,data=bunsan1)) ``` 上記プログラム内では読み込むブックの列数が3列であるとわかっているため、3つのオブジェクトを用意し、そのオブジェクトに各列のデータを格納しています。 そこで、このプログラムの一部を書き直し、列数が変数であっても(列数が読み込むブックごとに異なっていても)、それに応じた分散分析を行えるようにしたいです。 オブジェクトの数を、ループを用いて列数に応じた数用意し、それぞれ格納できるようにしたら良いと想像しています。しかし、それができません。 どのように変更したらよいのでしょうか。 ご教授ください、何卒よろしくお願いします。
回答: データフレームをカラム毎に分解する必要はなく、以下の様に書くことができます。データフレームなので各カラムの要素数はデータフレームの行数に等しい、という前提です。問題があるとすれば測定値の欠損ですが、今回の場合は欠損なし、として回答しています。 ``` bunsan1 <- data.frame( A = factor(rep(names(data), each=nrow(data))), y = unlist(data, use.names=F) ) ``` `boxplot(y~A,data=bunsan1,range=0,col="lightblue")` !plot その他に `tidyr` パッケージの `gather` を使う方法があります。 Gather columns into key-value pairs - gather • tidyr ``` library(tidyr) bunsan1 <- gather(data, key="A", value="y", factor_key=T) ```