No.21221 データの抽出と計算  【コロン】 2014/07/27(Sun) 10:35

いつもお世話になります。そして相変わらず基本的な質問で恐縮しております。

勉強のために教えていただきたいと思います。

次のようなデータがあるとします(Excelよりコピペ)。一行目はタイトル行です。
(青木先生作成の共分散分析を使おうとしておりまして.....)

s1 s2 g
76 18 1
89 19 1
65 15 1
77 14 1
69 15 1
90 14 2
89 15 2
79 12 2
89 13 2
78 15 2

私が行いたいのは,3列目の g が1のs2の平均を求めたいと言うことです。
私は以下のように書きましたが,一つ疑問が生じました。これを一行の関数で書けないかと。

上のデータのオブジェクトが d だとします。

a<-subset(d, g==1)
mean(a[,2])

で求まると思うのですが,これを一行で書くことは不可能でしょうか?

勉強のために教えてください。

No.21223 Re: データの抽出と計算  【taipapa】 2014/07/27(Sun) 12:13

a<-subset(d, g==1); mean(a[,2])
これも1行ですが...(^^;;;
ご希望はこちら? そのまま続けただけですが.
with(subset(d, g==1), mean(s2))

No.21224 Re: データの抽出と計算  【青木繁伸】 2014/07/27(Sun) 13:25

taipapa さんの解以外に,以下のようなものも
mean(d$s2[d$g==1])
by(d$s2, d$g, mean)[1]
mean(subset(d, g==1)[,2])
colMeans(subset(d, g==1))[2]
mean(split(d, d$g)[[1]][,2])
colMeans(split(d, d$g)[[1]])[2]
要素の添え字指定が不要という意味では,最初のもの mean(d$s2[d$g==1]) がよいと思います。添え字指定しない場合 by(d$s2, d$g, mean)d$g ごとの平均値ベクトルを返してくれるので,目的によっては好都合。

No.21225 Re: データの抽出と計算  【taipapa】 2014/07/27(Sun) 14:08

仰るように,青木先生の最初の解が一番スマートですね.
d$g ごとの平均値を出すのなら,ダサいですが,こんなのも...
with(d.df, tapply(s2, list(g==1), mean))
withがいやなら
tapply(d$s2, list(d$g==1), mean)

No.21228 Re: データの抽出と計算  【コロン】 2014/07/28(Mon) 15:32

青木先生,taipapa様

お礼が遅くなり申し訳ありませんでした。
とても勉強になりました。
こんなにたくさんの組み合わせがあるなんて驚きです。
ありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 046 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る