代码之家  ›  专栏  ›  技术社区  ›  Fr RAFOLS

以条件方式在R中使用sample()

  •  2
  • Fr RAFOLS  · 技术社区  · 7 年前

    我想为a的每个数字分配一个随机数B。 条件是分配给B的数字必须大于A的相应数字。 这是我的密码。 有什么方法可以更快地做到这一点吗?
    我尝试了for循环和其他方法,结果最差! 谢谢!

    set.seed(123)
    A <- rlnorm(10000,5,1) 
    B <- rlnorm(100000,10,2)
    df <- data.frame(NumPol=1:length(B), Cap=B)
    
    pol_sel <- sapply(1:length(A), FUN = function(i) { 
    sample(df$NumPol[which(df$Cap > A[i])], size=1, replace=TRUE) } )
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Samuel    7 年前

    我不确定我是否正确理解了你的问题,但也许你想要类似的东西:

    set.seed(123)
    A <- sample(10000, 10000)
    
    rnd.sample <- function(x) {
      i <- 1
      B <- c()
      for (i in 1:length(x)) {
        success <- FALSE
        while(success == FALSE) {
          s <- sample(100000, 1)
          if (s > x[i]) {
            success <- TRUE
            B[i] <- s
            i <- i + 1
          } else {}
        }
      }
      return(data.frame(A = x, B))
    }
    
    head(rnd.sample(A), 10)
    #       A     B
    # 1  2876 31060
    # 2  7883 32453
    # 3  4089 87026
    # 4  8828 32868
    # 5  9401 12571
    # 6   456 35623
    # 7  5278 93070
    # 8  8918 87518
    # 9  5510 82022
    # 10 4563 63124
    
        2
  •  0
  •   koohyar    7 年前

    对于每个元素 a 在A中,从B中大于 将由以下人员给出:

    sapply(A, function(a) sample(B[B > a], size = 1, replace = TRUE))
    

    如果速度不够快,您可以使用 mclapply 而不是 sapply 并行化(这应该很好,因为您正在使用 replace = TRUE 采样是独立的)。