データハンドリング

データ解析をするときに、何が一番困るってデータハンドリングだと思う*1。欠損があったときにどう処理しようかとか、行を追加したとか、そういうときの細々したところがさくさくできると、本題の解析に時間をかけるようになれていいかなと思ったので、書いてみる。

データフレームとは

データフレームとは見た目は行列みたいなもので、列にラベルを持っていて、ラベルによる操作が可能なもの。と、言われてもよく分からないので、具体的に説明。

sex    <- c("F","F","M","M","M")
height <- c(158,162,177,173,166)
weight <- c( 51, 55, 72, 57, 64)

こんな感じのデータがあるとする。下のようなデータをread.table(,head=TRUE)で読み込んできてもよい。

sex	height	weight
F	158	51
F	162	55
M	177	72
M	173	57
M	166	64

こんなデータを以下のような感じで読み込む。

x<-data.frame(sex,height,weight)
#x<-data.frame(sex=sex,height=height,weight=weight)ラベルを付け変えるなら、こっちでもよい

途中でnameという列を付け加えたくなったら、

x<-transform(x,name=name)
> x
  name sex height weight
1    A   F    158     51
2    B   F    162     55
3    C   M    177     72
4    D   M    173     57
5    E   M    166     64

という風にやればよい。また、行を減らしたいと思ったら

x<-subset(x,select=-c(name))
> x
  sex height weight
1   F    158     51
2   F    162     55
3   M    177     72
4   M    173     57
5   M    166     64

とやればよい。subsetは条件を満たすデータを抽出するような関数。selectで残すやつを選ぶのだが、「-」を付けてやるとそれらを除くという操作を行う。このやり方はいくつかの列を取り除きたいときにはいいが、除きたいほうがたくさんあるときは残すほうを指定した方が早い。そっちのやり方は下のほう。

transform(x[,c(2,3)])
  sex height
1   F    158
2   F    162
3   M    177
4   M    173
5   M    166

のような使いかたができる。でも、こっちだと名前の指定ができないのが嫌だなぁ。

subsetはこんな感じの使いかたもできる。

subset(x,sex=="M",c(weight,name))
  weight name
3     72    C
4     57    D
5     64    E

性別が男の人のweightとnameを表示。
データセットにたくさんのラベルが含まれるようになって、どんなものが含まれているか見たくなったときは

names(x)
[1] "name"   "sex"    "weight" "height"

とやればよい。変数の数を作りすぎた時に有効。

*1:個人的にね。