data.frameのsummary結果を表形式でファイル出力したい
すごく小さなTIPSだけれど、今まで気が付かなかったので書いておく。
RでCSVから読み込んだりしたデータで各列の基本統計量を見るには、単純に読み込んだデータ(data.frameオブジェクト)をsummary
関数へ渡してやればよい。
例えばCSVデータは大体こんな感じになっていると想定。
|Name|Height|Weight|
|:-:|:-:|:-:|:-:|
|フシギダネ|0.7|6.9|
|ヒトカゲ|0.6|8.5|
|ゼニガメ|0.6|9.0|
data.raw <- read.csv(file = "data.csv")
data.input <- data.raw[, -1] # Name列は削除
data.summary <- summary(data.raw) # データをそのままsummaryへ
print(data.summary)
> Height Wieght
> Min. :0.6000 Min. :6.900
> 1st Qu.:0.6000 1st Qu.:7.700
> Median :0.6000 Median :8.500
> Mean :0.6333 Mean :8.133
> 3rd Qu.:0.6500 3rd Qu.:8.750
> Max. :0.7000 Max. :9.000
ところがこの基本統計量のデータをCSVやEXCELに出力しようとすると、rowname
のない、しかも"Min. "などのラベルが含まれたデータが吐き出されてしまう。
write.csv(data.summary, file = "summary.csv")
""," Height"," Wieght"
"","Min. :0.6000 ","Min. :6.900 "
"","1st Qu.:0.6000 ","1st Qu.:7.700 "
"","Median :0.6000 ","Median :8.500 "
"","Mean :0.6333 ","Mean :8.133 "
"","3rd Qu.:0.6500 ","3rd Qu.:8.750 "
"","Max. :0.7000 ","Max. :9.000 "
ほしいデータは本来こんな感じなのだが...
" ","Height","Wieght"
"Min. ","0.6000","6.900"
"1st Qu.","0.6000","7.700"
"Median ","0.6000","8.500"
"Mean ","0.6333","8.133"
"3rd Qu.","0.6500","8.750"
"Max. ","0.7000","9.000"
applyで系列ごとにsummaryを適用すると表形式のデータが掃き出せる
理由はよく分かっていないのだけれど、apply
関数を使ってsummaryを列ごとに適用するとデータと行ラベルをうまく分離したmatrix
オブジェクトが取得できることが判明。
data.summary <- apply(data.input, 2, summary)
write.csv(data.summary, file = "summary.csv")
"" , "Height" , "Wieght"
"Min." , 0.6 , 6.9
"1st Qu." , 0.6 , 7.7
"Median" , 0.6 , 8.5
"Mean" , 0.6333 , 8.133
"3rd Qu." , 0.65 , 8.75
"Max." , 0.7 , 9
なおデータの中に統計量取れない値(文字列とか)が入っていると、他の列も含めて統計量が出ないので事前によけておくこと。
あとna
とかの混入もmatrixではなくlistで出てきてしまうので0置換などしておくよう注意する。
修論書いている途中にハマって、意外と調べたら出てこなかったのでメモしておく。