【发布时间】:2013-12-17 23:01:34
【问题描述】:
我的数据框中有一列(比如:类)。这是一个二进制类(将是 0/1)。
我正在尝试在这个变量中添加一些噪音..
我正在抛一枚有偏见的硬币,其正面朝上的概率是0.2。每次看到一个头,我都会翻转单元格中的值。因此,如果值为 0,则现在为 1,反之亦然
如何在 R 中做到这一点?
【问题讨论】:
标签: r
我的数据框中有一列(比如:类)。这是一个二进制类(将是 0/1)。
我正在尝试在这个变量中添加一些噪音..
我正在抛一枚有偏见的硬币,其正面朝上的概率是0.2。每次看到一个头,我都会翻转单元格中的值。因此,如果值为 0,则现在为 1,反之亦然
如何在 R 中做到这一点?
【问题讨论】:
标签: r
# an example vector
set.seed(1)
vec <- sample(0:1, 10, TRUE)
# [1] 0 0 1 1 0 1 1 1 1 0
# create 10 realizations of U(0,1)
coin <- runif(length(vec))
# [1] 0.2059746 0.1765568 0.6870228 0.3841037 0.7698414 0.4976992 0.7176185 0.9919061 0.3800352 0.7774452
# replace values in vec with their opposite (!vec) if coin <= 0.2
as.integer(xor(coin <= 0.2, vec))
# [1] 0 1 1 1 0 1 1 1 1 0
【讨论】:
vec 是一个因素。尝试使用 as.numeric(as.character(vec)) 将其转换为数值向量。
as.numeric(xor(coin < 0.2, vec))代替ifelse
xor 方法提供相同的输出并且速度要快得多
基于@Sven 解决方案的替代实现是
> (coin <- rbinom(length(vec), 1, 0.2))
[1] 0 0 0 0 0 0 0 1 0 0
> vec
[1] 0 0 1 1 0 1 1 1 1 0
> ifelse(coin, !vec, vec)
[1] 0 0 1 1 0 1 1 0 1 0
这直接使用二项分布模拟抛硬币。
【讨论】: