R
DataFrame

Rのdataframeをsummaryした結果をmatrixデータにまとめる方法

More than 1 year has passed since last update.

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")
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  "

ほしいデータは本来こんな感じなのだが...

summary.csv
"       ","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")
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置換などしておくよう注意する。

修論書いている途中にハマって、意外と調べたら出てこなかったのでメモしておく。