分组汇总仍然给出每一行的结果
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。
我有以下数据:
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。