分组汇总仍然给出每个单独行的结果

des*_*hen 2 r summarize tidyverse

我有以下数据:

\n
library(tidyverse)\n\ndf <- data.frame(id = c(1,1,1,2,2,2),\n                 x = rep(letters[1:2], each = 3),\n                 y = c(3,4,3,5,6,5),\n                 z = c(7,8,9,10,11,12))\n
Run Code Online (Sandbox Code Playgroud)\n

id我现在想通过一种获得z依赖值总和的方式来总结数据y。条件y本身取决于 的值x

\n

我以为我可以使用下面的代码,但这给了我所有输入 id 并且没有\xe2\x80\x98t 总结。结果是正确的,但我仍然希望每个 id 一行。

\n
df %>%\n  group_by(id) %>%\n  summarize(test = case_when(x == 'a' ~ sum(z[y == 3]),\n                             x == 'b' ~ sum(z[y == 5])))\n\n# A tibble: 6 x 2\n# Groups:   id [2]\n     id  test\n  <dbl> <dbl>\n1     1    16\n2     1    16\n3     1    16\n4     2    22\n5     2    22\n6     2    22\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
df %>%\n  group_by(id) %>%\n  summarize(test = case_when(all(x == 'a') ~ sum(z[y == 3]),\n                             all(x == 'b') ~ sum(z[y == 5])))\n\n# A tibble: 2 x 2\n     id  test\n  <dbl> <dbl>\n1     1    16\n2     2    22\n
Run Code Online (Sandbox Code Playgroud)\n

另外,有没有更直接的方法来进行总结?

\n

Ste*_*rbi 5

因为,case_when类似于ifelse(test, x, y)将返回与 长度相同的向量testall(x == z)长度为 1,因此返回值的长度为 1。