我使用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:2
和2:3
而不是1,2
和2,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)))
如何在一步或一组步骤中生成条件输出?
答案 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])