2011-11-11 7 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 

iがひどい結果と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

おかげで、それがないように見えるとして、最初に問題がありますランダム化が、2番目はOKです – jon

+0

ああ、はい。最初のものは列の順序をランダム化します... – kohske

+0

'ddply(mydf、。(bvar)、summarize、ans = sample(avar))' – hadley

関連する問題