在 R 中生成具有 8 个零和 2 个的 10 元素向量的排列
Generating permutations of a 10-element vector with 8 zeros and 2 ones in R
我正在生成 0 和 1 的 10 元素向量,并将 1 的可能数量从 2 变为 9。
例如
2 个值 = 1
1000000010
3 个值 = 1
1010100000
编辑:我想有效地生成所有可能的组合。
我有一种粗略的方法可以做到这一点,但我猜想有一种更简单的方法可以使用某种排列函数来实现。
我的方式:
使用 R 中的 sample
函数:我从一个全零向量开始,从 1 到 10 不加替换地抽取 2 个随机数,并将它们用作向量中元素的索引以更改为 1。我经常这样做很多次然后把我们的副本扔掉。
mat <- matrix(data = 0,nrow = 1000,ncol = 10) #matrix to hold output
vect <- rep(NA, 1000)
v0 <- rep(0,10) #initial vector of all 0s
for(i in 1:dim(mat)[1]){
mat[i, sample(1:10, 2)] <- 1
vect[i] <- paste(mat[i,], collapse = "") #collapse vector to a string
}
mat[duplicated(vect) !=T,] #remove duplicates
这是一种迂回的方法,但可以完成工作。
要在 10 元素向量中生成所有包含 2 个 1 的排列,请使用 combn(10,2)
枚举所有可能的位置:
t(apply(combn(10,2),2,function(x){ tmp<-rep(0,10); tmp[x]<-1; return(tmp) }))
这 returns 45 种不同的排列与使用采样的 OP 代码的结果相同,但效率更高。
我正在生成 0 和 1 的 10 元素向量,并将 1 的可能数量从 2 变为 9。
例如 2 个值 = 1
1000000010
3 个值 = 1
1010100000
编辑:我想有效地生成所有可能的组合。
我有一种粗略的方法可以做到这一点,但我猜想有一种更简单的方法可以使用某种排列函数来实现。
我的方式:
使用 R 中的 sample
函数:我从一个全零向量开始,从 1 到 10 不加替换地抽取 2 个随机数,并将它们用作向量中元素的索引以更改为 1。我经常这样做很多次然后把我们的副本扔掉。
mat <- matrix(data = 0,nrow = 1000,ncol = 10) #matrix to hold output
vect <- rep(NA, 1000)
v0 <- rep(0,10) #initial vector of all 0s
for(i in 1:dim(mat)[1]){
mat[i, sample(1:10, 2)] <- 1
vect[i] <- paste(mat[i,], collapse = "") #collapse vector to a string
}
mat[duplicated(vect) !=T,] #remove duplicates
这是一种迂回的方法,但可以完成工作。
要在 10 元素向量中生成所有包含 2 个 1 的排列,请使用 combn(10,2)
枚举所有可能的位置:
t(apply(combn(10,2),2,function(x){ tmp<-rep(0,10); tmp[x]<-1; return(tmp) }))
这 returns 45 种不同的排列与使用采样的 OP 代码的结果相同,但效率更高。