各位!
如何生成满足某些条件的向量?
问题:生成一个向量 a
使得 length(a)=400000
由 8 个元素组成:0, 5, 10, 50, 500, 5000 , 50000, 300000
.每个元素出现一定次数,分别为 290205、100000、8000、1600、160、32、2、1
。此外,a
被分成 4,000 个“组”,每组 100 个连续元素;称它们为 a_k, k=1,...,4000
。这些组必须满足以下条件:
- 每组的总和超过 150,即所有
k
的sum_i a_k_i>150
。 - 元素
5
、10
和50
在每组中出现 25 到 29 次,即对于所有k
,集合{i|a_i_k in (5,10,50)}
的震级在 25 到 29 之间。 0
在任何组中都不会连续出现超过 8 次。
我已经试过很多次了,但似乎不起作用: 我目前的代码如下:
T <- 4*10^(5) # data size
x <- c(0, 5, 10, 50, 500, 5000, 50000, 300000) #seed vector
t <- c(290205, 100000, 8000, 1600, 160, 32, 2, 1) #frequency
A <- matrix(0, 4000, 100) #4000 groups
k <- rep(0, times = 8) #record the number of seeds
for(m in 1:4000) {
p <- (t - k)/(T - 100*(m - 1)) #seed probability
A[, m] <- sample(x, 100, replace = TRUE, prob = p) #group m
sm <- 0
i <- 0
for(j in 1:92) {
if(sum(A[m,j:j + 8])==0){
if(A[m,j] > 0 & A[m,j] < 500) {i <- i+1}
sm <- sm+A[100*m+j]
}
else j <- 0
}
if (sm >= 150 & i > 24 & i < 30 & j != 0) {
m <- m + 1
for (n in seq_len(x)) {
k[n] <- sum(A[, m+1] == x[n]) + k[n]
}
}
}
最佳答案
仅通过构造来实现如何?例如:
amat<-matrix(rep(c(rep(rep(c(0,5),c(8,3)),8),
rep(c(0,NA),c(8,4))),4000),nrow=100)
amat[97:100,1:2205]<-c(rep(10,3),0)
amat[97:98,2206:4000]<-c(5,5)
amat[99:100,2206:2897]<-c(10,10)
amat[99:100,2898]<-c(5,50)
amat[99:100,2899:3307]<-c(5,50)
amat[99:100,3308:3902]<-c(50,50)
amat[which(is.na(amat))]<-rep(c(10,500,5000,5e4,3e5),c(1,160,32,2,1))
a<-c(amat)
这满足您的所有条件:
元素计数:
>sapply(c(0,5,10,50,500,5000,50000,300000),function(x)length(which(a==x)))
[1] 290205 100000 8000 1600 160 32 2 1
组和:
> table(colSums(amat)>=150)
TRUE
4000
5,10,50
频率:
> table(sapply(1:4000,function(x)abs(sum(amat[,x] %in% c(5,10,50))-27)<=2))
TRUE
4000
0
的运行:
> table(sapply(1:4000,function(x)max(rle(amat[,x])$lengths[rle(amat[,x])$values==0])<=8))
#If this is slow, we can just use max(rle(amax[,x]))<=8
# because there aren't many valid groups with strings of 9+
# non-0 elements
TRUE
4000
如果实际上我们永远不允许有 9 个 0
的字符串,我们将需要对组 2:2206 进行轻微调整,因为,例如a[100:108]==0
关于r - 如何生成满足某些条件的向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709330/