首页 > 解决方案 > 在 mutate 而不是 left_join 中使用 summarise

问题描述

我想知道这个工作流程是否可以改进:

dummy <- tibble(
  x = c(rep("A", 5), rep("B", 5), rep("C", 5)),
  value = c(1:15)
)

dummy %>%
  group_by(x) %>%
  summarise(rowsum = sum(value)) %>%
  mutate(s = sum(rowsum)) %>%
  left_join((dummy %>% pivot_longer(-x)), by = "x") 

理想情况下,我宁愿不使用调用原始数据框的 left_join - 有人对此有更好的建议吗?

标签: rtidyverse

解决方案


一个选项是replace除了第一个元素之外的元素NA并获取sum

library(dplyr)
library(tidyr)
dummy %>% 
   pivot_longer(-x) %>%
   group_by(x) %>%
   mutate(rowsum = sum(value), 
           s = replace(rowsum, row_number() != 1, NA)) %>% 
   ungroup %>%
   mutate(s = sum(s, na.rm = TRUE))
# A tibble: 15 x 5
#    x     name  value rowsum     s
#   <chr> <chr> <int>  <int> <int>
# 1 A     value     1     15   120
# 2 A     value     2     15   120
# 3 A     value     3     15   120
# 4 A     value     4     15   120
# 5 A     value     5     15   120
# 6 B     value     6     40   120
# 7 B     value     7     40   120
# 8 B     value     8     40   120
# 9 B     value     9     40   120
#10 B     value    10     40   120
#11 C     value    11     65   120
#12 C     value    12     65   120
#13 C     value    13     65   120
#14 C     value    14     65   120
#15 C     value    15     65   120

或不使用pivot_longer

dummy %>% 
    mutate(s = sum(value)) %>% 
    group_by(x) %>%
    mutate(rowsum = sum(value)) 

推荐阅读