Dplyr 相当于 SUM 超过 PARTITION BY
Dplyr equivalent of SUM over PARTITION BY
我确定以前有人问过这个问题,但我找不到答案。
这是我的数据:
df <- data.frame(group=c("a","a","a","b","b","c"), value=c(1,2,3,4,5,7))
df
#> group value
#> 1 a 1
#> 2 a 2
#> 3 a 3
#> 4 b 4
#> 5 b 5
#> 6 c 7
我想要第 3 列,其中每个 "group" 的总和为 "value",如下所示:
#> group value group_sum
#> 1 a 1 6
#> 2 a 2 6
#> 3 a 3 6
#> 4 b 4 9
#> 5 b 5 9
#> 6 c 7 7
如何使用 dplyr 执行此操作?
left_join(
df,
df %>% group_by(group) %>% summarise(group_sum = sum(value)),
by = c("group")
)
我不知道一步怎么做,但是
df_avg <- df %>% group_by(group) %>% summarize(group_sum=sum(value))
df %>% full_join(df_avg,by="group")
有效。 (这基本等同于@KeqiangLi的回答。)
ave()
,来自 base R,在这里也很有用:
df %>% mutate(group_sum=ave(value,group,FUN=sum))
使用 dplyr -
df %>%
group_by(group) %>%
mutate(group_sum = sum(value))
还没有人提到 data.table
:
library(data.table)
dat <- data.table(df)
dat[, `:=`(sums = sum(value)), group]
将 dat
转换为:
group value sums
1: a 1 6
2: a 2 6
3: a 3 6
4: b 4 9
5: b 5 9
6: c 7 7
我确定以前有人问过这个问题,但我找不到答案。
这是我的数据:
df <- data.frame(group=c("a","a","a","b","b","c"), value=c(1,2,3,4,5,7))
df
#> group value
#> 1 a 1
#> 2 a 2
#> 3 a 3
#> 4 b 4
#> 5 b 5
#> 6 c 7
我想要第 3 列,其中每个 "group" 的总和为 "value",如下所示:
#> group value group_sum
#> 1 a 1 6
#> 2 a 2 6
#> 3 a 3 6
#> 4 b 4 9
#> 5 b 5 9
#> 6 c 7 7
如何使用 dplyr 执行此操作?
left_join(
df,
df %>% group_by(group) %>% summarise(group_sum = sum(value)),
by = c("group")
)
我不知道一步怎么做,但是
df_avg <- df %>% group_by(group) %>% summarize(group_sum=sum(value))
df %>% full_join(df_avg,by="group")
有效。 (这基本等同于@KeqiangLi的回答。)
ave()
,来自 base R,在这里也很有用:
df %>% mutate(group_sum=ave(value,group,FUN=sum))
使用 dplyr -
df %>%
group_by(group) %>%
mutate(group_sum = sum(value))
还没有人提到 data.table
:
library(data.table)
dat <- data.table(df)
dat[, `:=`(sums = sum(value)), group]
将 dat
转换为:
group value sums
1: a 1 6
2: a 2 6
3: a 3 6
4: b 4 9
5: b 5 9
6: c 7 7