`dplyr`分布由小组绘制

时间:2014-07-02 14:54:37

标签: r dplyr

我想创建一个具有正态分布的随机变量measured,但是根据我data.frame中的另一个变量创建一个平均值。出于语法和效率的原因,我想在dplyr中执行此操作,我是新手。

library(dplyr)
fake <- data.frame(group = rbinom(50,1,0.5))
fake %>%
  group_by(group) %>%
  mutate(measured = rnorm(1, group, 0.5))

Source: local data frame [50 x 2]
Groups: group

   group      measured
1      1  0.3501516392
2      0 -0.0004234461
3      1  0.3501516392
4      0 -0.0004234461
5      0 -0.0004234461
6      0 -0.0004234461
7      1  0.3501516392
8      0 -0.0004234461
9      1  0.3501516392
10     1  0.3501516392

这里的问题是我得到一个附加到每个组的绘图,而不是每次观察时的独立绘图。

如何调用rnorm到我的小组的长度?或者我应该使用不同的函数进行随机抽取?

更新

所以我发现我可以调用组的长度length(group)。这会产生所需的行为,但我无法判断我是否要求nrow(fake)抽奖或brow(fake[group == 1,])抽奖。还有什么进一步的建议吗?

fake <- data.frame(group= rbinom(200,1,0.5))
fake <- fake %>%
  group_by(group) %>%
  mutate(random = rnorm(length(group), group, 0.5))
ggplot(fake, aes(x = random, fill = factor(group))) + geom_density(alpha=0.4)

Distribution of draws by group

1 个答案:

答案 0 :(得分:1)

我只是想指出甚至不需要分组。 rnorm可以采用方法向量,因此您只需将整个group列传递给它,而不会告诉它单独处理组:

fake %>%
  mutate(measured = rnorm(nrow(fake),group,0.5)) %>%
  head

  group    measured
1     1  1.16004276
2     0 -0.05366081
3     0 -0.78353925
4     0  0.01429192
5     0  0.26340507
6     0 -0.34022501

或等效地,正如@rrs指出的那样:

fake %>%
  mutate(measured = rnorm(n(),group,0.5))