統計ER

R, EZR, SPSS, KH Coder を使ったデータ分析方法を紹介するブログ。ニッチな内容が多め

R の attach とは

R の attach とはどんな関数か?

>>もう統計で悩むのを終わりにしませんか?


↑1万人以上の医療従事者が購読中

データフレームとは?

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の状態は続く。

>>もう統計で悩むのを終わりにしませんか?


↑1万人以上の医療従事者が購読中

データフレームの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() を使わないほうが無難である。

参考になれば。