Yaleで、遊んで学ぶ日々。
Yaleで、遊んで学ぶ日々。
囲碁、ときどきプログラミング、ところにより経済。
×
[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
> 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
R: 大文字・小文字の変換 << | HOME | >> 死亡指標のいろは (1) |
Calender
12 | 2025/01 | 02 |
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]
Latest Posts
(11/16)
(04/28)
(04/16)
(04/11)
(04/05)
Latest Trackbacks
Category
Access Analysis