統計ER

統計ソフトRの使い方を中心に、統計解析方法の解説をするブログ。ありそうでなかなか見つからないサンプルサイズ計算などニッチな方法について紹介しています。

統計ソフトRでデータフレームの操作ってどうやる?

ブログランキングに参加しています。
まずはぽちぽちっとお願いします。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
にほんブログ村 科学ブログ 数学へ

統計ソフトRで、データフレームというのはどんなものか?どのように扱うか?

データフレームとは?

統計ソフトRの中で、データフレームとは、データの一つの塊を言っている。

それも、変数名がついて、何列かのデータのことだ。

エクセルで言えば、A、B、Cと列が並んでいるところに、

  • Aには、年齢
  • Bには、性別
  • Cには、居住地

などのデータが入っているとする。

データを取得した人が100人だったとする。

この100人の年齢、性別、居住地の一塊が、データフレームだ。

エクセルのファイルをタブ区切りにテキストに変換し、Rに読み込むとそこでデータフレームになる。

Rへのデータの読み込み方

toukeier.hatenablog.com

↑リンク先の記事の「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()で呼び出してから使う。以下も参考に。

toukeier.hatenablog.com

データフレーム内の変数名を確認する

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 

と出力される。

これは便利。