如何为特定列中的每个值添加总计行,该行会根据其他列进行计算,

时间:2019-02-22 16:19:20

标签: r

假设我有这个数据框

enter image description here

我想要的是这个

enter image description here

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

我只是想知道是否有一种简单的方法来完成此操作,该方法不涉及多次利差和带有装饰总数的收集,我必须在将总数相加后将每月的天数更改回原始值,等等。快速简便的方法吗?

1 个答案:

答案 0 :(得分:2)

一种选择是按'month','days_in_month'分组并通过adorn_total ping应用group_map

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))