2012-03-09 102 views
12

是否有從數據框的一部分獲取行樣本的好方法?來自R數據集子集的行的隨機樣本

如果我有數據,如

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

那麼我可以很容易地品嚐三個F與的年齡與

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

,並得到類似

[1] 31 35 29 

但如果我把這個數據變成一個數據幀

mydf <- data.frame(gender, age) 

我不能使用明顯

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

雖然我可以編造一些與支架的荒唐數曲狀

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

,並得到我想要的是像

gender age 
7  F 35 
4  F 29 
1  F 23 

有沒有更好的方式,讓我花更少的時間來解決如何寫?

回答

17

你的複雜的方式幾乎是如何做到這一點 - 我認爲所有的答案將是該主題的變化。

例如,我想首先生成mydf$gender=="F"指數:

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

然後,我從該樣本:

mydf[ sample(idx,3), ] 

所以在同一行(雖然,可以減少支架的荒謬數並可能使您的代碼更易於通過多行進行理解):

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

雖然「我是黑客!」我的一部分喜歡單線,我的敏感部分說,即使雙線是兩條線,它更容易理解 - 這只是你的選擇。

+0

6括號(無論一行或兩行)肯定比10 – Henry 2012-03-09 02:39:12

+0

我仍然不能相信有沒有簡單的方法來進行這樣的funcamental統計過程中R.有一定有一個應用程序,我的意思是,這是一個包。 – 2013-08-05 21:46:13

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詳情請參見。