2011-11-11 69 views
1

我想在每個bvar級別內單獨應用avar。使用plyr或其他包對數據幀進行採樣

mydf <- data.frame(avar = c("A", "B", "C", 4, 5, 6, 7, 8, 9, 10), 
bvar = rep(1:2, each = 5)) 
mydf 
    avar bvar 
1  A 1 
2  B 1 
3  C 1 
4  4 1 
5  5 1 
6  6 2 
7  7 2 
8  8 2 
9  9 2 
10 10 2 

我試圖plyr

require(plyr) 
    daply (mydf, .(avar), sample) 

與可怕的結果。 plyr替代,也歡迎

回答

1

各種基礎的解決方案:

> mydf$rnd <- ave(mydf$avar, mydf$bvar, FUN=sample) 
> mydf 
    avar bvar rnd 
1  A 1 C 
2  B 1 B 
3  C 1 5 
4  4 1 4 
5  5 1 A 
6  6 2 7 
7  7 2 9 
8  8 2 6 
9  9 2 10 
10 10 2 8 

> aggregate(mydf$avar, mydf["bvar"], FUN=sample) 
    bvar x.1 x.2 x.3 x.4 x.5 
1 1 4 C 5 B A 
2 2 7 9 10 8 6 

> by(mydf$avar, mydf[["bvar"]], FUN=sample) 
mydf[["bvar"]]: 1 
[1] C B 5 4 A 
Levels: 10 4 5 6 7 8 9 A B C 
----------------------------------------------------------- 
mydf[["bvar"]]: 2 
[1] 9 8 6 10 7 
Levels: 10 4 5 6 7 8 9 A B C 
5

試試這個:

> daply(mydf, .(bvar), sample) 
$`1` 
    avar bvar 
1 A 1 
2 B 1 
3 C 1 
4 4 1 
5 5 1 

$`2` 
    avar bvar 
6  6 2 
7  7 2 
8  8 2 
9  9 2 
10 10 2 

> daply(mydf, .(bvar), summarize, ans = sample(avar)) 
$`1` 
    ans 
1 A 
2 C 
3 4 
4 B 
5 5 

$`2` 
    ans 
1 10 
2 9 
3 7 
4 8 
5 6 
+0

感謝,首先有一個問題,因爲它似乎不隨機化,但第二個是好的 – jon

+0

啊,是的。第一個隨機化列的順序... – kohske

+0

你可能想'ddply(mydf,。(bvar),summary,ans = sample(avar))' – hadley