根据另一个R中的因素对一列进行洗牌

时间:2013-09-19 13:14:20

标签: r

我创建了一个数据框来说明我的问题。我对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中的混洗值。

感谢。

3 个答案:

答案 0 :(得分:5)

像这样:

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

你也可以写:

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

答案 1 :(得分:4)

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

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

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

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

DT2 <- copy(DT)[,b:=sample(b),by=a]

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