「applyを使ってると、data.frameのカラム名を触れない」なんてことはなかった

この前書いてたやつに関して。applyでデータの列ごとに処理していて、列の名前も含めたいよねという状況を考えている。

なんか素晴らしくよく分からないことやっているような気がするんだけどw*1、よく考えたら簡単にできた。上のやつではsとかが必要ないベクトルですよね。で、結局、applyから触れないならば触れるデータを渡してやればいいんじゃないかという考えに行きついた。

簡単に言えば、withで*2temporaryなデータフレームを生成するという感じ。

> head(with(cars,{rbind(names(cars),cars)}))
  speed dist
1 speed dist
2     4    2
3     4   10
4     7    4
5     7   22
6     8   16

で、applyのfunction側でちょっと加工してやれば自由にできるよね。

apply(with(cars,{rbind(names(cars),cars)}),2,
      function(x){
        name <- x[1]
        x <- as.numeric(x[-1])
        hist(x,xlab=name,
             main=paste("Histgram of ",name,sep=""),
             sub=paste("Mean:",mean(x),",Var:",round(var(x)),sep="")
             )
      })


こんなplotがデータの列分だけできる。列が50個とかあって、それぞれの特徴をplotさせたいとかいう時にはよい感じじゃないかなーと思います。withとか、applyとか、functionの柔軟性が素敵すぎる。

追記

withとかいらなかったな。特に必要ないのになんで書いていたかが不明すぐる。

apply(rbind(names(cars),cars),2,
      function(x){
        name <- x[1]
        x <- as.numeric(x[-1])
        hist(x,xlab=name,
             main=paste("Histgram of ",name,sep=""),
             sub=paste("Mean:",mean(x),",Var:",round(var(x)),sep="")
             )
      })

*1:そこまででもないか

*2:withは必要なかったので、打ち消し線