for循环中的R - sample()会产生相同的排列吗?

时间:2011-10-26 17:32:59

标签: r permutation

当我运行一个简单的for循环来计算向量的X个排列时,sample()函数为每次迭代返回相同的排列。

以下是我的代码:

options <- commandArgs(trailingOnly=T)
labels <- read.table(options[2], header=F)
holder <- c()

for (i in 1:options[1]){

    perm <- sample(labels[,2:ncol(labels)], replace=F)
    perm <- cbind(as.character(labels[1]), perm)
    holder <- rbind(holder, perm)

}

write.table(holder, file=options[3], row.names=F, col.names=F, quote=F, sep='\t')

有这样的原因吗?是否有另一种简单的方法来生成1000个矢量的排列?

* 评论后添加 - 可复制的示例 *

vec <- 1:10
holder <-c()
for (i in 1:5){
    perm <- sample(vec, replace=F)
    holder <- rbind(holder, perm)
}

> holder
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
perm    3    2    1   10    9    6    7    4    5     8
perm    5    8    2    3    4   10    9    1    6     7
perm   10    7    3    1    4    2    5    8    9     6
perm    9    5    2    8    3    1    6   10    7     4
perm    3    7    5    6    8    2    1    9   10     4

这很好用!我想我在某个地方有个虫子!我的意见可能是一团糟。

谢谢, d。

谢谢, d。

1 个答案:

答案 0 :(得分:2)

对于可重现的示例,只需将options[1]替换为常量集,将labels替换为内置或自定义数据框。 (顺便说一下,伟大的变量名称都不是基本函数。)只要查看for循环的内部部分,就可以对除data.frame的第一列之外的所有变量进行洗牌。这可以按预期工作。在完成制作print(names(perm))之后加入perm,你会看到。然后,您rbind将此数据框添加到之前的结果中。 rbind,识别它正在使用数据框,有助于重新排列不同数据框的列顺序,以便列名排列(通常,这是您希望它做的;列的名称定义它是哪一个,你想要适当地扩展每一列。)

问题是你正在对数据框的列进行排列,而不是像你想象的那样对“向量”进行排列。