首页 > 解决方案 > 在 tapply() 中为 sample() 分配概率

问题描述

使用以下内容:

name<-c(rep("Adam", times = 6), rep("Barry", times = 4), rep("Charlie", times = 5))
group<-c(1:15)
probs<-c(0.4, 0.2, 0.1, 0.15, 0.1, 0.05, 0.25, 0.35, 0.3, 0.1, 0.2, 0.15, 0.30, 0.15, 0.2)
df<-data.frame(name, group, probs)

我正在尝试创建一个输出,该输出采用每个 $name 并根据 $probs 的概率为其分配一个 $group。例如,亚当有 40% 的机会在第 1 组,20% 的机会在第 2 组,10% 的机会在第 3 组,等等。

最终结果将根据这些概率为每个名称返回一组,看起来像这样

   Adam   Barry Charlie 
      5      10      12 

我相信我应该使用 tapply() 并运行以下命令,但这并不能解释各种概率

tapply(df$group, df$name, sample, 1)

为了利用各种概率,我也尝试了以下方法,但由于概率数不正确,它返回错误

tapply(df$group, df$name, sample, 1, prob = df$probs)

非常感谢任何有关如何解决这些问题并获得所需输出的见解。

标签: rsampletapply

解决方案


tapply 只能接受一个向量,因此您需要执行以下操作:

by(df,df$name,function(i)sample(i$group,1,prob=i$probs))

然而输出不是那么好,

df$name: Adam
[1] 2
------------------------------------------------------------ 
df$name: Barry
[1] 8
------------------------------------------------------------ 
df$name: Charlie
[1] 12

推荐阅读