使用plyr或其他包在数据帧内进行采样

时间:2011-11-11 01:02:39

标签: r dataframe plyr

我想在每个级别的bvar中单独应用avar。

 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替代品也欢迎

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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