如何用ave()按条件对变量进行求和?

时间:2018-03-10 01:38:22

标签: r

我今晚真的进入了ave()。在分组数据框中,我想要一个变量,其中每个组的控制条件d==0中的值之和。 d==1的行也应获得d==0的值。如果该群组不包含任何d==0,则应生成NA

set.seed(26)
n <- 100
df1 <- data.frame(d=rbinom(n, 1, .5),
                  group=rbinom(n, 5, .5),
                  val=rnorm(n, 1000, 100))
> head(df1, 3)
  d group       val
1 0     3  955.9525
2 0     1 1089.0666
3 1     2  993.6181

ave()函数会生成正确的值,但会遗漏所有d==1

df1$n0 <- with(df1, ave(val[d == 0], group, FUN=sum))

有了这个ifelse(),我也无法做正确的事。

with(df1, ifelse(d==0,
                 ave(val[d==0], group, FUN=sum),
                 NA))

我想要这样的东西

    d group  val    n0
1   0     1  955   955
3   1     1  993   955
4   1     2  949  1895
5   0     2  954  1895
6   0     2  941  1895
...

如何添加d==1条件,以便他们收到d==0个值?

1 个答案:

答案 0 :(得分:2)

在这种情况下,一些算术运算:

df1$n0 <- with(df1, ave(val*(d==0), group, FUN=sum))