R の attach とはどんな関数か?
データフレームとは?
R の中で、データフレームとは、データの一つの塊を言っている。
それも、変数名がついて、何列かのデータのことだ。
エクセルで言えば、A、B、Cと列が並んでいるところに、
- Aには、年齢
- Bには、性別
- Cには、居住地
などのデータが入っているとする。
データを取得した人が100人だったとする。
この100人の年齢、性別、居住地の一塊が、データフレームだ。
エクセルのファイルをタブ区切りにテキストに変換し、Rに読み込むとそこでデータフレームになる。
データフレームを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した状態として使えるようになる。
R で attach を使わない便利な方法
with()を使うとattacheも~~$も不要になる。
つまり、
with(sleep, table(group))
とするということ。
> with(sleep, table(group))
group
1 2
10 10
と出力される。
まとめ
R の attach() という関数を解説した。
データフレームを指定しなくてよくなるが、混乱することが多くなる。
with() などを使うようにして、attach() を使わないほうが無難である。
参考になれば。
コメント