【问题标题】:dplyr mutate using rbinom do not return random numbersdplyr 使用 rbinom 变异不返回随机数
【发布时间】:2015-08-07 22:23:41
【问题描述】:

我想使用 mutate 来计算使用二项分布的列。

我有以下例子:

library("dplyr")

d = data.frame(ref = rbinom(100,100,0.5))
d$coverage = 100
d$prob = 0.5
d$eprob= d$ref / d$coverage
d = tbl_df(d)

mutate(d,
       ref1= ref,
       cov1 = coverage,
       eprob1 = eprob,
       ref2=rbinom(1, coverage, eprob),
       ref3=rbinom(1, cov1, eprob1)
       )

结果是这样的:

Source: local data frame [100 x 9]

   ref coverage prob eprob ref1 cov1 eprob1 ref2 ref3
1   52      100  0.5  0.52   52  100   0.52   45   44
2   50      100  0.5  0.50   50  100   0.50   45   44
3   45      100  0.5  0.45   45  100   0.45   45   44
4   45      100  0.5  0.45   45  100   0.45   45   44
5   47      100  0.5  0.47   47  100   0.47   45   44
6   46      100  0.5  0.46   46  100   0.46   45   44
7   50      100  0.5  0.50   50  100   0.50   45   44
8   53      100  0.5  0.53   53  100   0.53   45   44
9   44      100  0.5  0.44   44  100   0.44   45   44
10  56      100  0.5  0.56   56  100   0.56   45   44

我不明白 - 我希望 mutate 函数返回从 ref 和覆盖率(“ref2”)给出的二项分布中抽取的随机数...

Mutate 正确读取列 - 但是在调用 rbinom 时会发生一些奇怪的事情...

感谢任何帮助。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    尝试更改rbinomn

    mutate(d,
       ref1= ref,
       cov1 = coverage,
       eprob1 = eprob,
       ref2=rbinom(100, coverage, eprob),
       ref3=rbinom(100, cov1, eprob1)
    )
    

    或更笼统地说:

    mutate(d,
       ref1= ref,
       cov1 = coverage,
       eprob1 = eprob,
       ref2=rbinom(n(), coverage, eprob),
       ref3=rbinom(n(), cov1, eprob1)
    )
    

    【讨论】:

    • 一个更通用的解决方案是rbinom(n(), coverage, eprob),因为n() 会找到正在变异的任何数据的大小。 (这也适用于分组表)
    • @DavidRobinson - 是的,这样更好。我将编辑我的答案以反映这一点。谢谢。
    • 但这不会对所有 100 次平局使用相同的 eprob 值吗? (这不是我想要的——我不想从 100 个不同的二项分布中抽取 1 个数字,因为 eprobe 有 100 个不同的值)。
    • 刚刚测试过——你是对的(对你来说并不意外)。非常感谢。将接受这是一个有效的答案。不过我不太喜欢这种语法......无论如何 - 非常感谢你们 - 你真的帮助了我!
    • 我阅读了 mutate 语法,因为每个变量都保存一个值 - 然后 rbinom(n(),...) 突然变成长度为 n 的向量。但我应该将变量视为列(向量)。
    【解决方案2】:

    另一种解决方案是:

    d %>% rowwise() %>%
          mutate(ref1= ref,
                 cov1 = coverage,
                 eprob1 = eprob,
                 ref2=rbinom(1, coverage, eprob),
                 ref3=rbinom(1, cov1, eprob1))
    

    rowwise() 命令按(每)行分组,并指定每行需要 1 个随机值。

    【讨论】:

    • 这可行,但随着行数的增加,速度会大大变慢。
    • 但我认为这是唯一一个给出正确答案的人,因为每一行的 eprob 都不同 - 我必须在星期一测试它 - 但我真的非常感谢一个有效的答案- 因为我今天早些时候在我的代码中发现了这个错误 - 我们即将提交论文 - 所以谢谢!
    • 忽略我的评论 - 两种解决方案都很好用。第一个更快 - 但最后一个的语法可能更直观(?)
    • 我认为第一个更好。如果您有 N 行,我的解决方案将采样 N 次。第一个将发现具有相同概率的行并将它们组合在一起。从给定分布中采样 10 个值比从同一给定分布中采样 10 次更快。 (这里是 10 个例子).... 显然,不是按行分组,而是按概率列分组。如果在你的 N 行中你有 N 个唯一的概率值,那么这些方法将是相同的...... PS:祝你这篇论文好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多