在现有R数据帧中实现随机数概率,使用的概率取决于另一列

时间:2018-02-11 22:46:23

标签: r dataframe random conditional-compilation

我使用Walker的别名方法来调整随机舍入数据,即基数3.我已经将列值分配给数据框中的每个值3 AliasColumn'. The values in the AliasColumn are integers in the range 1 through 5`。 I've used the Alias Method from here。数据框看起来像这样(它有64行):

 Industry     AliasColumn
 1            5
 2            5
 3            4
 4            2
 5            3
 6            1
 7            2
 8            2
 9            3
10            5
11            4
12            4
13            4
14            2
15            2
16            1
17            4
18            3
19            5
20            5

基于AliasColumn值,我需要抛出一个装满硬币的硬币来创建"真实的"业务计数(NumBusinesses),介于1和5之间。加载的硬币表为:

 AliasColumn      1      2      3     4       5
 "Heads prob"    8/12   11/12   1    10/12    5/12
 "Alias prob"    4/12    1/12   -     2/12    7/12
 Alias value      2      3      -     3       1

例如,如果AliasColumn值为1,则NumBusinesses值为8的时间为1,而NumBusinesses值为4 {12} 2.对于AliasColumn值3,这是唯一可以分配给NumBusinesses的值。

因此,NumBusinesses接收两个值中的一个,其概率以AliasColumn中的特定列为条件。因为NumBusinesses列只能取两个值中的一个,并且因为它们是整数,并且根据AliasColumn中的值而不同,所以我希望在R中使用sample()函数。我无法让它发挥作用。

我试过了(我在我的代码中注意到我已经将AliasColumn值4的代码与1和2的代码区别开来,但输出似乎没有任何不同当我最初使用1:22:3而不是1,22,3分别运行时:

foo$NumBusinesses[AliasCol==1] <-sample(c(1,2),1, replace=TRUE,prob=c(8,4))
foo$NumBusinesses[AliasCol==2] <-sample(c(2,3),1, replace=TRUE,prob=c(11,1))
foo$NumBusinesses[AliasCol==3] <- 3
foo$NumBusinesses[AliasCol==4] <-sample(c(3:4),1, replace=TRUE,prob=c(2,10))
foo$NumBusinesses[AliasCol==5] <-sample(c(1,5),1, replace=TRUE,prob=c(7,5))

这似乎将NumBusinesses值设置为与AliasColumn中的值相同,除了NumBusinesses值为5,然后AliasColumn值为被设置为1。

我考虑了一个ifelse循环,并尝试了一个:

ifelse(foo$AliasCol==1, foo$NumBusinesses<- Sample(c(1,2),1, replace=TRUE,prob=c(8,4)),
                                       ifelse(foo$AliasCol==2),
                                       foo$NumBusinesses<- sample(c(2,3),1, replace=TRUE,prob=c(11,1)),
                                       ifelse(foo$AliasCol==3), foo$NumBusinesses<- 3,
                                       ifelse(foo$AliasCol==4), 
                                       foo$NumBusinesses <- sample(c(3:4),1, replace=TRUE,prob=c(2,10)),
                                       foo$NumBusinesses <- sample(c(1,5),1, replace=TRUE,prob=c(7,5)))

我收到了这个错误(这让我相信我正在过度思考循环):

 Error in ifelse(foo$AliasCol == 1, foo$NumBusinesses <- sample(c(1,  :   unused arguments (foo3$NumBusinesses <- sample(c(2, 3), 1, replace = TRUE, prob = c(11, 1)), ifelse(foo$AliasCol == 3), foo$NumBusinesses <- 3, ifelse(foo$AliasCol == 4), foo$NumBusinesses <- sample(c(3:4), 1, replace = TRUE, prob = c(2, 10)), foo$NumBusinesses <- sample(c(1, 5), 1, replace = TRUE, prob = c(7, 5)))

如何在一步或一组步骤中生成条件输出?

1 个答案:

答案 0 :(得分:1)

说你有这个:

#probabilities of not changing AliasColumn
headProb<-c(8/12,   11/12,   1 ,   10/12,    5/12)
#alias values when AliasColumn changes
aliasValues<-c(2,3,NA,3,1)
#your data.frame
df<-structure(list(Industry = 1:20, AliasColumn = c(5L, 5L, 4L, 2L, 
3L, 1L, 2L, 2L, 3L, 5L, 4L, 4L, 4L, 2L, 2L, 1L, 4L, 3L, 5L, 5L
)), .Names = c("Industry", "AliasColumn"), class = "data.frame", row.names = c(NA, -20L))

然后你可以尝试:

ifelse(runif(nrow(df))<=headProb[df$AliasColumn],
       df$AliasColumn,aliasValues[df$AliasColumn])