1

我正在尝试创建一些数据。首先,我想抛 40 个公平的硬币。对于每个正面朝上的硬币,或 1,我想再掷一枚公平的硬币。

我认为rbinomifelse语句中使用会起作用,但我得到的结果似乎很奇怪。

这是我的代码,其中aa代表了翻转前 40 个硬币cc的结果,我认为代表了为每个硬币正面朝上翻转第二个硬币的结果aa

ifelse我在下面多次重复该语句并得到两个结果之一。cc匹配的第一个结果aa和第二个结果全是 0。这些结果令人困惑。感谢您对正在发生的事情提供任何建议或解释。

set.seed(1234)

aa <- rbinom(40, 1, 0.5) ; aa
# [1] 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 1 1
cc <- ifelse(aa == 1, rbinom(1, 1, 0.5), 0) ; cc
# [1] 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 1 1
cc <- ifelse(aa == 1, rbinom(1, 1, 0.5), 0) ; cc
# [1] 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 1 1
cc <- ifelse(aa == 1, rbinom(1, 1, 0.5), 0) ; cc
# [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cc <- ifelse(aa == 1, rbinom(1, 1, 0.5), 0) ; cc
# [1] 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 1 1
cc <- ifelse(aa == 1, rbinom(1, 1, 0.5), 0) ; cc
# [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cc <- ifelse(aa == 1, rbinom(1, 1, 0.5), 0) ; cc
# [1] 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 1 1
4

2 回答 2

3

您当前的代码可能并不理想,因为“尾部”翻转和没有翻转(因为aa==0)导致相同的输出(0)。此外,您的第二次翻转仅提供一次翻转而不是翻转向量,因此所有cc结果都是相同的 0 和 1 序列或全为 0 的原因(取决于第二次翻转分别是 1 还是 0 )。尝试:

cc <- ifelse(aa == 1, rbinom(length(aa), 1, 0.5), NA); cc
于 2013-06-11T06:35:33.063 回答
1

在评估 ifelse 语句时,R 似乎真的很懒惰,所以它只调用 rbinom(1,1,0.5)一次

cc <- ifelse(aa == 1, rbinom(1,1,0.5), 0) 

相当于:

cc <- aa
cc[cc == 1] <- rbinom(1,1,0.5)

我玩了一下,让 R 多次调用 rbinom 的唯一方法是在 for 循环中进行:

set.seed(1234)
aa <- rbinom(40, 1, 0.5); aa
# [1] 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 1 1
cc <- aa
for (i in seq_along(cc)) {
    cc[i] <- ifelse(cc[i] == 1, rbinom(1,1,0.5), 0)
}
cc
#  [1] 0 1 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0
于 2013-06-11T06:40:32.467 回答