我创建了一个数据框来说明我的问题。我对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中的混洗值。
感谢。
答案 0 :(得分:5)
像这样:
dogframe$b <- ave(dogframe$b, dogframe$a, FUN = sample)
你也可以写:
dogframe$b <- with(dogframe, ave(b, a, FUN = sample))
答案 1 :(得分: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]
答案 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