【问题标题】:R: Create a categorical variable when probability is givenR:给定概率时创建一个分类变量
【发布时间】:2015-06-06 16:35:49
【问题描述】:

我有两个可以使用以下代码复制的数据帧:

df=data.frame(xcode=c("612","920","924","925"),
              ratio.company1=c("0.1","0.9","0.4","0"),
              ratio.company2=c("0.1","0","0.6","0.6"),  
              ratio.company3=c("0.8","0.1","0","0.4"))
df

df2=data.frame(id=c("101","101","101","101","101","101","102","102","102","102","102","103","103","104","104","104","104","104","104","104","104","105","105","105","106","106","106","106","106","106","107","107","107","107","107","107"),
       xcode=c("612","612","612","612","612","612","612","612","612","612","612","920","920","920","920","920","920","920","920","920","920","924","924","924","924","924","924","924","924","924","925","925","925","925","925","925"),
       company=c(""))
df2

df 给出了基于 xcode 字段的人被分配到 company1 或 company 2 或 Company 3 的概率。 df2 给了我 ID 和 xcode。根据 xcodes 给出的比例,df2 中的 ID 需要分为公司 1,2,3。

例如,在 xcode 612 的 11 个 ID 中,10% 分配给公司 1,10% 分配给公司 2,80% 分配给公司 3。我想将我的结果四舍五入到小数点后 0 位。我想不出办法来实现这一目标。我可以以某种方式使用runif 命令吗?请帮忙。

我的结果数据集如下所示:

df2=data.frame(id=c("101","101","101","101","101","101","102","102","102","102","102","103","103","104","104","104","104","104","104","104","104","105","105","105","106","106","106","106","106","106","107","107","107","107","107","107"),
       xcode=c("612","612","612","612","612","612","612","612","612","612","612","920","920","920","920","920","920","920","920","920","920","924","924","924","924","924","924","924","924","924","925","925","925","925","925","925"),
       company=c("company1","company2","company3","company3","company3","company3","company3","company3","company3","company3","company3",
                 "company1","company1","company1","company1","company1","company1","company1","company1","company1","company3",
                 "company1","company1","company1","company1","company2","company2","company2","company2","company2",
                 "company2","company2","company2","company2","company3","company3"))

【问题讨论】:

  • 想要的输出是什么?
  • @MamounBenghezal:推荐使用所需结果进行编辑。谢谢!
  • 可能类似于round(9/11, digits = 1) ?

标签: r variables distribution


【解决方案1】:

这将提供对您请求的一种可能解释:

c('comp1','comp2','comp3')[
                  findInterval( runif(36) , 
                                c(0, cumsum( as.numeric(as.character(df[1,2:4]))) ))]
#-----------
 [1] "comp3" "comp3" "comp3" "comp3" "comp2" "comp3" "comp3" "comp3" "comp3"
[10] "comp3" "comp3" "comp3" "comp2" "comp3" "comp1" "comp3" "comp1" "comp3"
[19] "comp1" "comp3" "comp3" "comp3" "comp3" "comp2" "comp3" "comp3" "comp1"
[28] "comp3" "comp3" "comp3" "comp3" "comp3" "comp3" "comp2" "comp3" "comp3"

我过去回答类似问题的经验是,通常会有一个不言而喻的期望,即比例恰好为 0.1、0.1 和 0.8,而这并没有实现这一期望。如果你想得到这些比例的精确(或几乎精确,因为 36 的 10% 不是整数),你需要使用rdirichlet 而不是runif。或者您可以在c(rep('comp1', 3), rep('comp2', 4), rep('comp3', 29)) 的向量上使用sample。

【讨论】:

  • 使用您的代码,我的输出是所有 36 行的 comp1。你知道为什么吗?谢谢!
  • 运气不好?让我想起那句话:“如果我没有运气不好,我就不会没有运气”。
  • 我再次运行它并得到:32 comp3; 1个补偿;和 3 comp2。我警告过你,你可能对真正的随机性不满意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
相关资源
最近更新 更多