6

我创建了一个数据框来说明我的问题。我对 R 比较陌生。

    #### permutation problem

a <- c("beagle", "beagle", "beagle", "basset", "basset")
b <- c(44, 33, 22, 34, 42)
c <- c(1:5)
d <- c(7:11)

dogframe <- data.frame(cbind(a,b,c,d))


output
> dogframe
       a  b c  d
1 beagle 44 1  7
2 beagle 33 2  8
3 beagle 22 3  9
4 basset 34 4 10
5 basset 42 5 11
> 

我想要做的是通过列a中的因素随机洗牌b列。因此,值 44,33 和 22 将为“beagle”打乱,而 34 和 42 将为 basset 打乱。我希望结果是一个类似于原始数据框的数据框,在 b 列中只有经过洗牌的值。

谢谢。

4

3 回答 3

5

像这样:

dogframe$b <- ave(dogframe$b, dogframe$a, FUN = sample)

你也可以写:

dogframe$b <- with(dogframe, ave(b, a, FUN = sample))
于 2013-09-19T13:17:34.070 回答
4

好的,您已经有了base解决plyr方案。这是此类问题的第三种选择:

require(data.table)
DT <- data.table(dogframe)

DT[,b:=sample(b),by=a]

这会覆盖该b列;如果你想把它放在一个单独的副本中,你会这样做:

DT2 <- copy(DT)[,b:=sample(b),by=a]
于 2013-09-19T13:28:28.360 回答
2

你也可以用这个plyr包来做,这样:

ddply(dogframe, "a", function(df) { df$b <- df$b[sample(nrow(df))]; df})

例如:

       a  b c  d
1 basset 42 4 10
2 basset 34 5 11
3 beagle 44 1  7
4 beagle 22 2  8
5 beagle 33 3  9
于 2013-09-19T13:17:48.480 回答