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