首页 > 解决方案 > 我如何为特定列中的每个值添加一个总行,根据其他列进行计算,

问题描述

假设我有这个数据框

在此处输入图像描述

我想要的是这个

在此处输入图像描述

我想要做的是创建按月变量分组的行,然后获得总变量的总和,以及该月所有值的days_month变量的唯一值。

我只是想知道是否有一种简单的方法可以做到这一点,它不涉及多个点差和带有装饰总数的聚集,我必须在合计后将每月的天数改回原始值等。有没有一个快速和简单的方法来做到这一点?

标签: r

解决方案


一种选择是按“月”、“天数_in_月”分组并adorn_total通过group_mapping应用

library(dplyr)
library(janitor)
df1 %>% 
    group_by(month, days_in_month) %>%
    group_map(~ .x %>%
                  adorn_totals("row"))  %>%
    select(names(df1))
# A tibble: 10 x 4
# Groups:   month, days_in_month [2]
#   month person total days_in_month
#   <int> <chr>  <int>         <int>
# 1     1 John       7            31
# 2     1 Jane      18            31
# 3     1 Tim       20            31
# 4     1 Cindy     11            31
# 5     1 Total     56            31
# 6     2 John      18            28
# 7     2 Jane      13            28
# 8     2 Tim       15            28
# 9     2 Cindy      9            28
#10     2 Total     55            28

如果我们需要其他统计数据,我们可以将其放入group_map

library(tibble)
df1 %>% 
  group_by(month, days_in_month) %>% 
  group_map(~ bind_rows(.x, tibble(person = "Mean", total = mean(.x$total))))

数据

df1 <- structure(list(month = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), person = c("John", 
   "Jane", "Tim", "Cindy", "John", "Jane", "Tim", "Cindy"), total = c(7L, 
 18L, 20L, 11L, 18L, 13L, 15L, 9L), days_in_month = c(31L, 31L, 
  31L, 31L, 28L, 28L, 28L, 28L)), class = "data.frame", row.names = c(NA, 
-8L))

推荐阅读