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

Using sample() in R in a conditional way

我想为每个 A 数分配一个随机数 B。 条件是B分配的number必须大于A对应的number。 这是我的代码。 有什么方法可以更快地做到这一点?
我尝试了 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) } )

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

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

对于 A 中的每个元素 a,从 B 中大于 a 的元素中采样一个实例将给出:

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

如果不够快,您可以使用 mclapply 而不是 sapply 来并行化(这应该没问题,因为您使用的是 replace = TRUE 并且采样是独立的) .