R:数据框逐行随机化

时间:2011-11-07 18:15:43

标签: r

我在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 

我知道样本工作正常,但它是否保留了列的等效性?

4 个答案:

答案 0 :(得分:3)

> 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

答案 1 :(得分:1)

一次只抽取一列,你会没事的。例如:

data[,2] = sample(data[,2])
data[,3] = sample(data[,3])
...

如果您有多列,可以将其扩展为:

data[,-1] = apply(data[,-1], 2, sample)

编辑:关于行等效的澄清,这只是:

data[,-1] = data[sample(nrow(data)),-1]

答案 2 :(得分:0)

“价值等值”是什么意思? 老实说,我没有收到消息,但这是我的猜测。如您所说,您可以使用样本,但可以在列上单独使用,例如通过申请:

 # 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)

答案 3 :(得分:0)

在plyr中使用colwise方法进行优雅的列式排列:

test <- data.frame(matrix(nrow=4,ncol=10,data=1:40))

加载plyr

require(plyr)

创建列式“样本”函数

colwise.sample <- colwise(sample)

申请所需的行

permutation.test <- test
permutation.test[,c(1,3,4)] <- colwise.sample(test[,c(1,3,4)])