使用rbinom进行dplyr变异时不返回随机数
我想使用mutate来计算一个使用二项分布的列 我举了以下例子:使用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
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:祝你报纸好运!