我在R中有一个我想要随机化的数据帧,保持第一列不变,但将最后两列随机化在一起,这样在这些列的同一行中出现的值在随机化后都将出现在同一行中。因此,如果我从这个开始:
1 a b c
2 d e f
3 g h i
当随机化时,它可能看起来像:
1 a e f
2 d h i
3 g b c
我知道这个示例运行得很好,但是它是否保持了列的等价性?
发布于 2011-11-07 18:26:24
> t <- data.frame(matrix(nrow=4,ncol=10,data=1:40))
> t
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 1 5 9 13 17 21 25 29 33 37
2 2 6 10 14 18 22 26 30 34 38
3 3 7 11 15 19 23 27 31 35 39
4 4 8 12 16 20 24 28 32 36 40
> columns_to_random <- c(8,9,10)
> t[,columns_to_random] <- t[sample(1:nrow(t),size=nrow(t)), columns_to_random]
> X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 1 5 9 13 17 21 25 32 36 40
2 2 6 10 14 18 22 26 29 33 37
3 3 7 11 15 19 23 27 30 34 38
4 4 8 12 16 20 24 28 31 35 39
发布于 2011-11-07 18:20:26
一次只对一列进行采样,就可以了。例如:
data[,2] = sample(data[,2])
data[,3] = sample(data[,3])
...
如果你有很多列,你可以像这样扩展:
data[,-1] = apply(data[,-1], 2, sample)
EDIT:关于行等效性的说明,这只是:
data[,-1] = data[sample(nrow(data)),-1]
发布于 2011-11-07 18:29:09
你所说的“价值对等”是什么意思?老实说,我不明白,但这是我的猜测。正如您所说,您可以使用sample,但在您的列上单独使用它,例如通过应用:
# create a reproducible example
test <- data.frame(indx=c(1,2,3),col1=c("a","d","g"),
col2=c("b","e","h"),col3=c("c","f","i"))
xyz <- apply(test[,-1],MARGIN=2,sample)
as.data.frame(xyz)
https://stackoverflow.com/questions/8040745
复制