【问题标题】:changing the binary value of a columnin r based on flipping a coin基于掷硬币改变 r 中列的二进制值
【发布时间】:2013-12-17 23:01:34
【问题描述】:

我的数据框中有一列(比如:类)。这是一个二进制类(将是 0/1)。

我正在尝试在这个变量中添加一些噪音..

我正在抛一枚有偏见的硬币,其正面朝上的概率是0.2。每次看到一个头,我都会翻转单元格中的值。因此,如果值为 0,则现在为 1,反之亦然

如何在 R 中做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:
    # 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
    

    【讨论】:

    • @Sven 当我执行 !vec 时,它返回 NA?
    • @Fraz 也许你的vec 是一个因素。尝试使用 as.numeric(as.character(vec)) 将其转换为数值向量。
    • @SvenHohenstein:耶! :)
    • 你可以用as.numeric(xor(coin &lt; 0.2, vec))代替ifelse
    • xor 方法提供相同的输出并且速度要快得多
    【解决方案2】:

    基于@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
    

    这直接使用二项分布模拟抛硬币。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2016-01-24
      相关资源
      最近更新 更多