r - 如何生成满足某些条件的向量?

标签 r vector sample

各位! 如何生成满足某些条件的向量?
问题:生成一个向量 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。这些组必须满足以下条件:

  1. 每组的总和超过 150,即所有 ksum_i a_k_i>150
  2. 元素 51050 在每组中出现 25 到 29 次,即对于所有 k,集合 {i|a_i_k in (5,10,50)} 的震级在 25 到 29 之间。
  3. 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/

相关文章:

linux - 在 Linux 系统中安装 r 依赖项?

R,数据表 : find all combinations of a list excluding each element paired with itself

c - 动态分配结构 vector 内存

c++ - 'CreateDirectoryW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' in OpenCV 2. 4.5 和 VS 2010

r - 用于检查列表是否按降序排序的除法征服算法

debugging - 打印堆栈跟踪并在 R 中发生错误后继续

C++ - 删除包含 vector 的结构 vector 会导致内存泄漏吗?

c++ - 计算高度图的法线

MySQL按日期时间字段采样数据

ruby - 仅从 Ruby 中的数组中选取随机元素