分组汇总仍然给出每一行的结果

grouped summarize still gives result for each individual row

我有以下数据:

library(tidyverse)

df <- data.frame(id = c(1,1,1,2,2,2),
                 x = rep(letters[1:2], each = 3),
                 y = c(3,4,3,5,6,5),
                 z = c(7,8,9,10,11,12))

我现在想按 id 汇总数据,根据 y 值得到 z 的总和。 y 条件本身取决于 x.

的值

我以为我可以使用下面的代码,但这给了我所有的输入 ID 并且没有总结。结果是正确的,但我还是想每个id一行。

df %>%
  group_by(id) %>%
  summarize(test = case_when(x == 'a' ~ sum(z[y == 3]),
                             x == 'b' ~ sum(z[y == 5])))

# A tibble: 6 x 2
# Groups:   id [2]
     id  test
  <dbl> <dbl>
1     1    16
2     1    16
3     1    16
4     2    22
5     2    22
6     2    22

下面的代码有效,但我不明白为什么它有效而上面的代码却没有。

df %>%
  group_by(id) %>%
  summarize(test = case_when(all(x == 'a') ~ sum(z[y == 3]),
                             all(x == 'b') ~ sum(z[y == 5])))

# A tibble: 2 x 2
     id  test
  <dbl> <dbl>
1     1    16
2     2    22

另外,有没有更直接的方法来做我的总结?

因为,case_when 类似于 ifelse(test, x, y) 将 return 与 test 具有相同长度的向量。 all(x == z) 的长度为 1,因此 returned 的值的长度为 1。