2014-02-20 32 views
0

我有一個大的數據集的等效,一個子集的看起來像這樣:使用樣品()或在一個數據幀的2個變量

Var1 Var2 
9  29_13x 
14 41y 
9  51_13x 
4  101_13x 
14 105y 
14 109y 
9  113_13x 
9  114_13x 
14 116y 
14 123y 
4  124_13x 
14 124y 
14 126y 
4  134_13x 
4  135_13x 
4  137_13x 
9  138_13x 
4  139_13x 
14 140y 
9  142_13x 
4  143_13x 

我的代碼位於一個循環內,我希望能夠在沒有替換的情況下抽樣,從每個不同的Var1類別中抽取一定數量的Var2(由循環迭代定義)。所以,對於i = 4我想獲得這樣的事:

29_13x 
51_13x 
113_13x 
138_13x 

這些都是從VAR1 = 9

41y 
109y 
126y 
140y 

從VAR1 = 14,和

101_13x 
134_13x 
137_13x 
139_13x 

所有從Var1 = 4。

我不能讓sample()跨多個變量工作,並且找不到其他任何方式來執行此操作。任何建議將不勝感激。

回答

0

這裏有兩個選項。

使用samplebytapply

by(mydf$Var2, mydf$Var1, FUN=function(x) sample(x, 4)) 
tapply(mydf$Var2, mydf$Var1, FUN=function(x) sample(x, 4)) 

下面是一些輸出,tapply例如:

out[[3]] 
# [1] "116y" "126y" "124y" "105y" 

out[["14"]] 
# [1] "116y" "126y" "124y" "105y" 

out <- tapply(mydf$Var2, mydf$Var1, FUN=function(x) sample(x, 4)) 
out 
# $`4` 
# [1] "101_13x" "143_13x" "124_13x" "134_13x" 
# 
# $`9` 
# [1] "114_13x" "113_13x" "142_13x" "29_13x" 
# 
# $`14` 
# [1] "116y" "109y" "140y" "105y" 

您還可以通過索引位置或名稱提取單個矢量

子集通過分組變量的基礎上的隨機變量rank編輯:

x <- rnorm(nrow(mydf)) 
mydf[ave(x, mydf$Var1, FUN = rank) %in% 1:4, ] 
+0

非常感謝這些,他們是偉大的,但我有一個問題要問,這兩個輸出使得很難(至少對我來說)只提取被子集化的Var2。無論它們來自哪個Var1(在此過程中是多餘的),是否容易得到所有這些矢量? – user3122022

+0

@ user3122022,'tapply'變種可能是最容易使用的變種。作爲結果,你會得到一個向量列表。看到我編輯的答案。 – A5C1D2H2I1M1N2O1R2T1

+0

謝謝,但我的問題是,在循環內會有不同數量的Var1和Var2,所以我需要一個通用的語句,將所有的Var2作爲一個向量(或更好的單列數據幀)。所以對於上面的例子,我需要'101_13x,143_13x,124_13x,134_13x,114_13x,113_13x,142_13x,29_13x,116y,109y,140y,105y'作爲一個向量,並且沒有其他附加。 – user3122022

相關問題