忍者ブログ
Yaleで、遊んで学ぶ日々。

Yaleで、遊んで学ぶ日々。

囲碁、ときどきプログラミング、ところにより経済。
[173]  [172]  [171]  [170]  [169]  [168]  [167]  [166]  [165]  [164]  [163
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Rでdata.frameを扱っているときに、ある変数の値ごとに何らかの操作をしたい、ということがよくある。例えば、次のような身長と性別のデータがあるとして、「性別ごとに平均を出したい」のようなことだ。
> dat
   height gender
1  164.06      0
2  160.83      1
3  162.93      0
4  172.79      1
5  168.85      1
6  162.42      0
7  158.12      1
8  166.14      0
9  174.02      1
10 158.29      1


こういった操作は、by() 関数でできる。
> by(dat, dat$gender, mean)
dat$gender: 0
  height   gender
163.8875   0.0000
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000


使い方は by(data, INDICES, FUN, ... ) で、
dataには対象となるdata.frame を、 INDICESには場合分けをするための変数を、FUNには使用する関数を与える。FUNの第1引数がdataの部分になり、FUNが他にも引数をとる場合には後に続ける。


例えばデータが欠損値を含んでいる場合、単にmean() で平均を出そうとすると欠損値が返ってくる。欠損値を無視するには、mean() を呼ぶ際に na.rm=T というオプションを加える。
> dat
   height gender
1  164.06      0
2  160.83      1
3      NA      0
4  172.79      1
5  168.85      1
6  162.42      0
7  158.12     1
8  166.14      0
9  174.02      1
10 158.29      1

> by(dat, dat$gender, mean)
dat$gender: 0
height gender
    NA      0
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000

> by(dat, dat$gender, mean, na.rm=T)
dat$gender: 0
  height   gender
164.2067   0.0000
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000
>



by() 関数の返り値は "by" というクラスなのだが、これはリストを継承する。したがって、インデックスで呼び出すなどの操作も可能。

> b <- by(dat, dat$gender, mean)

> b
dat$gender: 0
  height   gender
163.8875   0.0000
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000

> names(b)
[1] "0" "1"

> b[[1]]   
  height   gender
163.8875   0.0000

> b[["1"]]
  height   gender
165.4833   1.0000

> b$`0`
  height   gender
163.8875   0.0000

上の例では0と1の意味する所が無意味に分かりにくくなってしまっているが、b[[1]] はリストの第1要素(つまりgender:0に対する部分)、b[["1"]] はgender:1に対する部分、b$`0`はgender:0に対する部分を抜き出している。



ちなみに、無理矢理代入することも一応できるようだ。
> b[[1]] <- "replaced"

> b
dat$gender: 0
[1] "replaced"
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000




PR
この記事にコメントする
お名前:
タイトル:
文字色:
メールアドレス:
URL:
コメント:
パスワード:   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Calender
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Search in This Blog
Latest Comments
[03/30 川内のばば山田]
[03/30 川内のばば山田]
[08/06 Aterarie]
[07/05 Agazoger]
[07/01 Thomaskina]
Oldest Posts
Latest Trackbacks
フリーエリア

Barcode
Access Analysis
Powerd by NINJAブログ / Designed by SUSH
Copyright © Yaleで、遊んで学ぶ日々。 All Rights Reserved.
忍者ブログ [PR]