統計ソフトRで、データフレームというのはどんなものか?どのように扱うか?
- データフレームとは?
- データフレームの内容を見る
- データフレーム内の変数名を確認する
- データフレーム内のデータの要約を見る
- データフレームをattachする
- データフレームのattachをやめる
- データフレームに作成した変数を追加する
- 編集後記
- 編集後記2
データフレームとは?
統計ソフトRの中で、データフレームとは、データの一つの塊を言っている。
それも、変数名がついて、何列かのデータのことだ。
エクセルで言えば、A、B、Cと列が並んでいるところに、
- Aには、年齢
- Bには、性別
- Cには、居住地
などのデータが入っているとする。
データを取得した人が100人だったとする。
この100人の年齢、性別、居住地の一塊が、データフレームだ。
エクセルのファイルをタブ区切りにテキストに変換し、Rに読み込むとそこでデータフレームになる。
Rへのデータの読み込み方
↑リンク先の記事の「dat」がデータフレームだ。
データフレームの内容を見る
データフレームの中身を見るには、開かなくてもいい。
str()という関数で中身がみられる。
strはstructure(構造)の頭3文字だ。
たとえばgehanという名前のデータフレームの内容を見れば以下のようになる。
意味は、42人のデータ、4変数で、$変数名:変数型 値の一部が出力されている。
> library(MASS) > str(gehan) 'data.frame': 42 obs. of 4 variables: $ pair : int 1 1 2 2 3 3 4 4 5 5 ... $ time : int 1 10 22 7 3 32 12 23 8 22 ... $ cens : int 1 1 1 1 1 0 1 1 1 1 ... $ treat: Factor w/ 2 levels "6-MP","control": 2 1 2 1 2 1 2 1 2 1 ...
gehanというデータは、MASSパッケージに入っている。MASSパッケージはlibrary()で呼び出してから使う。以下も参考に。
データフレーム内の変数名を確認する
str()で変数名を確認することはできるが、変数名だけを確認したいときはnames()関数を使う。
最初から使える組み込みデータで、変数を見てみよう。
> names(sleep) [1] "extra" "group" "ID" > names(chickwts) [1] "weight" "feed" > names(airquality) [1] "Ozone" "Solar.R" "Wind" "Temp" "Month" "Day" > names(esoph) [1] "agegp" "alcgp" "tobgp" "ncases" "ncontrols"
MASSパッケージの二つのデータフレームも見てみよう。
library(MASS)は一回のセッションで一回実行すればよい。前項で実行していれば、二度目は不要だ。
> names(gehan) [1] "pair" "time" "cens" "treat" > names(bacteria) [1] "y" "ap" "hilo" "week" "ID" "trt"
データフレーム内のデータの要約を見る
データフレーム内のデータの要約を見るなら、summary()関数を使う。
summaryは要約、要旨という意味だ。
結果は変数の型によって違う。
数値型(num)の場合は、最小値、第1四分位、中央値、平均値、第3四分位、最大値の6つが表示される。
要因型(Factror)の場合は、度数(人数)が表示される。
> summary(sleep) extra group ID Min. :-1.600 1:10 1 :2 1st Qu.:-0.025 2:10 2 :2 Median : 0.950 3 :2 Mean : 1.540 4 :2 3rd Qu.: 3.400 5 :2 Max. : 5.500 6 :2 (Other):8
データフレームをattachする
attachとはくっつけるという意味だ。
データフレーム内の変数は、どのデータフレームのなんという変数かを指定しないと、どの変数かRがわからない。
attach()関数を使うと、そのあとはどのデータフレームかを指定しなくてよくなる。つまり、データフレームの中の変数を使いやすくする。
sleepを使って確認してみよう。
> str(sleep) 'data.frame': 20 obs. of 3 variables: $ extra: num 0.7 -1.6 -0.2 -1.2 -0.1 3.4 3.7 0.8 0 2 ... $ group: Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ... $ ID : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
sleepのなかのgroupを集計してみようとすると、エラーメッセージが出る。
> table(group) Error in table(group) : object 'group' not found
そこでsleepの中のgroupだよと教えてあげると、集計結果が出てくる。1も2も10人ずつという結果だ。
> table(sleep$group) 1 2 10 10
attach()を使ってみるとどうか。
先にattach()をしておくと、sleep$がいらなくなる。
> attach(sleep) > table(group) group 1 2 10 10
次に説明するdetach()でattachを終了するまで、attachの状態は続く。
データフレームのattachをやめる
attachをやめるときは、detach()を使う。
detachは分離する、取りはずすの意味だ。
attachをしたデータフレームのattachを取りやめるときに使う。
detach(sleep)
detach()したあとは、前項のようにtable(group)だけ指令を出しても、 groupが存在しないと言われてしまう。
> detach(sleep) > table(group) Error in table(group) : object 'group' not found
sleep$でデータフレームを指定しなくてはならない状態に戻っている。
> table(sleep$group) 1 2 10 10
これはattach()とセットで大事な関数だ。解析が進むと、新しい変数を作りたくなる。そしてデータフレーム内に格納したくなる。
その時に一度detachしてから再度attachしないと、新しい変数が認識されない。
なので、attach(), detach()はセットで覚えて、新しい変数を頻繁に作るなら、attach(), detach()を駆使する必要がある。
データフレームに作成した変数を追加する
解析を進めていくと、連続変数からカテゴリ変数を作成して、それを解析に使いたくなったりするのは、先ほども言った通り。
新しくカテゴリ変数を作成したときに、それをもとのデータフレームに追加する方法。
たとえば、年齢ageから10歳刻みのカテゴリ変数(年代変数)agecを作成したとする。
もとのデータフレームがdatであれば、以下のようにしてdatに追加できる。
dat$agec <-agec
ここでattachとの絡みでややこしいことが起こる。
新しい変数はデータフレーム内で作れない。新しいagecはどのデータフレームにも所属していないので、agecはagecのみだ。
それをdatの中に入れるが、それはコピーで入ることになるので、もとのagecはそのままのこる。
データフレーム内では、dat$agecと認識されるが、このdatをattachするとどうなるか?
統計ソフトRはもとのagecと、attachしたdat内のagecの区別がつかなくなる。
まったく同じものだから問題はないが、警告が出るのでちょっと気持ち悪い。
まただんだん根詰めてやっていると、同じ名前で、切り方を変えた変数を作ってしまったりする。10歳刻みを5歳刻みにしてみようとか。
そうすると本格的に混乱してくる。
そんなときは、データフレームに組み込む際に、名前を変えてRも自分も混乱を避けるという方法がとれる。例えばagecをagec1とするなどだ。
dat$agec1 <- agec
新しい変数を組み込んだら、detachしてから、もう一度attachしなおす。
detach(dat) attach(dat)
こうするとagec1がattachした状態として使えるようになる。
編集後記
実は、ぼくはattach()を使わなくなった。
新しい変数を作った時のdetach & attachの作業が煩雑で、忘れると混乱してしまう。
なのでattachを使わないで面倒でない方法を探ることにした。
一つの方法はデータフレーム名を短くすること。
datよりもっと短く、それもいくつも作っても大丈夫なように、d1, d2などにする。
変数名も短く短くする。原則アルファベット3文字。
年齢、性別、居住地、グループなどは、age, sex, adr, grpなどとする。
名前を短くすることを徹底すれば、データフレーム名を付けて使うのも、気にならなくなった。
多変量モデルの場合は、data=で、データフレームをインプットすれば、 モデル式内ではデータフレーム名+$は不要になる。
こうして、今はattachは使わなくなったというわけだ。
参考になれば。
編集後記2
with()を使うとattacheも~~$も不要になる。
つまり、
with(sleep, table(group))
とするということ。
> with(sleep, table(group)) group 1 2 10 10
と出力される。
これは便利。