使用rbinom进行dplyr变异时不返回随机数

使用rbinom进行dplyr变异时不返回随机数,r,dplyr,R,Dplyr,我想使用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, re

我想使用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和coverage给出的二项式分布中提取的随机数(“ref2”)

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


感谢您的帮助。

尝试更改
rbinom
n

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)
)

另一个解决办法是:

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

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

一个更通用的解决方案是
rbinom(n(),coverage,eprob)
,因为
n()
查找任何正在变异的数据的大小。(这也适用于分组表)@DavidRobinson-是的,这样更好。我将编辑我的答案以反映这一点。谢谢。但这不是对所有100张图纸都使用相同的eprob值吗?(这不是我想要的-我不想从100个不同的二项式分布中提取1个数字,因为eprob具有100个不同的值)。只是测试了它-你是对的(对你来说并不意外)。谢谢。我会接受这个有效的答案。但是我不太喜欢这个语法。。。不管怎样,谢谢大家,你们真的帮了我的忙!我阅读了mutate语法,因为每个变量都有一个值,
rbinom(n(),…)
突然变成了一个长度为n的向量。但我应该把变量看作列(向量)。这是可行的,但随着行数的增加,速度会慢得多。但我认为这是唯一给出正确答案的变量,因为每行的eprob不同-我必须在周一测试它-但我确实,非常感谢你能给出一个有效的答案——因为我今天早些时候在我的代码中发现了这个bug——我们马上就要提交论文了——谢谢!忽略我的评论-两种解决方案都很有效。第一个更快,但最后一个的语法可能更直观(?)我认为第一个更好。如果有N行,我的解决方案将采样N次。第一个将发现具有相同概率的行,并将它们分组在一起。从给定分布中采样10个值比从同一给定分布中采样10次更快。(10是这里的一个例子)。。。。显然,不是按行分组,而是按概率列分组。如果在N行中有N个唯一的概率值,则方法将是相同的。。。PS:祝你报纸好运!