R 如何避免结果生成器中的循环

R 如何避免结果生成器中的循环,r,dataframe,loops,R,Dataframe,Loops,我有一个数据框架,其中包含三种结果的概率:a、B和C。它们的概率是prob1、prob2和prob3: df = data.frame(prob1=runif(1000,0,0.2),prob2=runif(1000,0,0.1)) df$prob3 = 1-df$prob1-df$prob2 我试图模拟每一行的结果,给出其唯一的概率,并运行以下循环: df$outcome = NA for (i in 1:1000) { df$outcome[i]<-sample(c(A,B,

我有一个数据框架,其中包含三种结果的概率:a、B和C。它们的概率是prob1、prob2和prob3:

df = data.frame(prob1=runif(1000,0,0.2),prob2=runif(1000,0,0.1))
df$prob3 = 1-df$prob1-df$prob2

我试图模拟每一行的结果,给出其唯一的概率,并运行以下循环:

df$outcome = NA
for (i in 1:1000) {
   df$outcome[i]<-sample(c(A,B,C), 1, prob = c(df$prob1[i],df$prob2[i],df$prob3[i]), replace = FALSE)
}
df$outcome=NA
对于(1:1000中的i){

df$outcome[i]您可以使用
apply

df$outcome <- apply(df, 1, function(x) sample(c(A, B, C), 1, prob = x))

您可以使用
apply

df$outcome <- apply(df, 1, function(x) sample(c(A, B, C), 1, prob = x))

这里有一种通过多项式抽样的方法:

m <- t(apply(df,1,rmultinom,n=1,size=1))  ## 1000 x 3 matrix of 0/1 values
w <- apply(m,1,which)                     ## vector of 1000 values in {1,2,3}
我修改了列名,因为
rMultinom
自动使用列名作为示例的值


如果您需要真正快速的向量化多项式采样,并且愿意处理编译代码的麻烦,那么的答案会有所帮助。

这里有一种通过多项式采样的方法:

m <- t(apply(df,1,rmultinom,n=1,size=1))  ## 1000 x 3 matrix of 0/1 values
w <- apply(m,1,which)                     ## vector of 1000 values in {1,2,3}
我修改了列名,因为
rMultinom
自动使用列名作为示例的值

如果您需要真正快速的向量化多项式采样,并且愿意处理编译代码的麻烦,那么的答案可能会有所帮助