2017-11-22 9 views
2

Aの各番号にBの乱数を割り当てたい。 の条件は、Bの割り当てられた数値がAの対応する数より大きくなければならないという条件である。 ここに私のコードです。 これを行う方法はありますか?
私は最悪の結果でforループと他の方法を試しました! ありがとう!条件式のRでsample()を使用する

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) }) 
+1

私はこれを完全に理解しています。 AとBが異なるサイズの場合、「Bの数は対応するAの数よりも大きくなければならない」という意味はどうですか? –

+1

Bを得るためにAに加える正の数を無作為に選んでみませんか? – MrFlick

+0

ありがとうございました。はい、AとBのサイズが異なります。 Bが大きい。 Aの各値に対して、Aの対応する値よりも大きいBの乱数を見つけたいと思っています。 –

答えて

0

私は私が正しくあなたの質問を理解してわからないんだけど、多分あなたはこれに似た何かしたい:これはBの要素から1つのインスタンスをサンプリングし、Aの各要素aに対して

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 
+0

私の答えを更新しました。確認してください。 – jsb

+0

ありがとう、しかしこれは私が必要とする苦労ではありません。 Aには10,000クレームの金額があるとします。 Bには、それぞれ100,000件の保険契約があり、それぞれのリスクについて保証されています。私は、各請求をポリシーにランダムに割り当てたいと思う。しかし、条件は、保険金が請求よりも大きくなければならないということです。 –

+0

もう一度私の答えを更新しました。確認してください。 – jsb

0

をそれは十分に速くはない場合、あなたはmclapplyの代わりを使用することができます

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

aはで与えられるよりも大きくなっていますを並列化してください(これはreplace = TRUEを使用しており、サンプリングは独立しているので問題ありません)。

関連する問題