2012-03-09 6 views
12

データフレームの一部から行のサンプルを取得する良い方法はありますか?私はちょうどそのようなRデータフレームのサブセットからのランダムな行のサンプル

gender <- c("F", "M", "M", "F", "F", "M", "F", "F") 
age <- c(23, 25, 27, 29, 31, 33, 35, 37) 

などのデータを持っている場合は

は、私は簡単に

sample(age[gender == "F"], 3) 

とFの3の年齢をサンプリングし、

[1] 31 35 29 

のようなものを得ることができますが、このデータをデータフレームに変換すると、

私は

mydf[sample((1:nrow(mydf))[mydf$gender == "F"], 3), ] 

のような括弧の不条理な数の複雑な何かをでっち上げると私は

gender age 
7  F 35 
4  F 29 
1  F 23 
のようなものである欲しいものを得ることができますが、私は明らかに

sample(mydf[mydf$gender == "F", ], 3) 

を使用することはできません

mydf <- data.frame(gender, age) 

書き方を工夫する時間がかかりません。

答えて

17

あなたの畳み込まれた方法は、それを行う方法がかなりあります - 私はすべての答えがそのテーマのバリエーションになると思います。

例えば、私が最初にmydf$gender=="F"インデックスを生成したい:

idx <- which(mydf$gender=="F") 

その後、私はそれからサンプル:

mydf[ sample(idx,3), ] 

をだから、1行で(、あなたは括弧の不条理数を減らすものの、おそらく複数の行を持つことでコードを分かりやすくすることができます)。

mydf[ sample(which(mydf$gender=='F'), 3), ] 

「私はハッカーです!私の一部は1ライナーを好む、私の感覚的な部分は、2ライナーが2ラインであっても、はるかに理解できると言います - それはあなたの選択です。

+0

6かっこ(1行か2行かに関わらず)は確かに10より優れています。 – Henry

+0

Rでこのような基本的な統計処理を実行する簡単な方法はまだありません。アプリが必要です。そのためのパッケージです。 –

9

あなたはは、私は明白なことを使用することはできませんと言う:

sample(mydf[mydf$gender == "F", ], 3) 

しかし、あなたはそれを行うための独自の関数を書くことができます:

sample.df <- function(df, n) df[sample(nrow(df), n), , drop = FALSE] 

、あなたのサブセットの選択にそれを実行します。

sample.df(mydf[mydf$gender == "F", ], 3) 
# gender age 
# 5  F 31 
# 4  F 29 
# 1  F 23 

(個人的にはsample.df(subset(mydf, gender == "F"), 3)が簡単に見つかります読む。)

2

これが今の私のパッケージにsampleの強化版と簡単です:

library(devtools); install_github('kimisc', 'krlmlr') 

library(kimisc) 
sample.rows(subset(mydf, gender == "F"), 3) 

詳細についても、このrelated answerを参照してください。

関連する問題