R 添加';总计';df中列中每个组的行

R 添加';总计';df中列中每个组的行,r,dataframe,R,Dataframe,我有一个数据框,可以在其中对列size进行分组。当数据帧按大小排列时,我希望在df中以行的形式显示每个组的每列的总数 library(dplyr) dat <- data.frame(size = c("S", "XS", "L", "M", "L", "L", "XS"), category = c("shirt&q

我有一个数据框,可以在其中对列
size
进行分组。当数据帧按大小排列时,我希望在df中以行的形式显示每个组的每列的总数

library(dplyr)
dat <- data.frame(size = c("S", "XS", "L", "M", "L", "L", "XS"), 
           category = c("shirt", "shirt", "shirt", "shirt", "pants", "hat", "pants"),
           store1 = c(22, 3, 52, 10, 5, 37, 21),
           store2 = c(43, 13, 2, 24, 6, 12, 40))

dat %>%
  arrange(size) 

  size category store1 store2
1    L    shirt     52      2
2    L    pants      5      6
3    L      hat     37     12
4    M    shirt     10     24
5    S    shirt     22     43
6   XS    shirt      3     13
7   XS    pants     21     40

任何建议都将不胜感激

请注意,请求不是。因此,可能需要将摘要统计信息版本存储在其他对象中。除此之外,下面将创建一个包含存储总计的对象,以及另一个对象,其中新类别“总计”描述该大小的存储总计

library( tidyverse )
library( janitor )

dat %>%
  dplyr::arrange( size ) %>%
  split( .[,"size"] ) %>%
  purrr::map_df(., janitor::adorn_totals)

#  size category store1 store2
#     L    shirt     52      2
#     L    pants      5      6
#     L      hat     37     12
# Total        -     94     20
#     M    shirt     10     24
# Total        -     10     24
#     S    shirt     22     43
# Total        -     22     43
#    XS    shirt      3     13
#    XS    pants     21     40
# Total        -     24     53
store_totals <- dat %>%
    group_by(size) %>%
    summarise(store1 = sum(store1),
              store2 = sum(store2))
newdat <- add_row(.data = dat,
        store_totals) %>%
    arrange(size)
newdat$category[is.na(newdat$category)] <- "total"

请注意,请求不是。因此,可能需要将摘要统计信息版本存储在其他对象中。除此之外,下面将创建一个包含存储总计的对象,以及另一个对象,其中新类别“总计”描述该大小的存储总计

store_totals <- dat %>%
    group_by(size) %>%
    summarise(store1 = sum(store1),
              store2 = sum(store2))
newdat <- add_row(.data = dat,
        store_totals) %>%
    arrange(size)
newdat$category[is.na(newdat$category)] <- "total"

使用
group\u modify
将摘要行绑定到组数据的末尾,然后在最终的mutate中修复总计行上的大小和类别字段。 我们在结尾使用了
data.frame
,因为它的输出看起来更好一些,但是可以省略。如果不需要问题中所示的精确输出形式,则可以稍微简化。这只使用dplyr

dat %>% 
  group_by(size) %>%
  group_modify(~ bind_rows(., summarize(., across(where(is.numeric), sum)))) %>%
  ungroup %>%
  mutate(category = coalesce(category, paste("Total", size)),
         size = if_else(startsWith(category, "Total"), "", size)) %>%
  data.frame
给予:

   size category store1 store2
1     L    shirt     52      2
2     L    pants      5      6
3     L      hat     37     12
4        Total L     94     20
5     M    shirt     10     24
6        Total M     10     24
7     S    shirt     22     43
8        Total S     22     43
9    XS    shirt      3     13
10   XS    pants     21     40
11      Total XS     24     53

使用
group\u modify
将摘要行绑定到组数据的末尾,然后在最终的mutate中修复总计行上的大小和类别字段。 我们在结尾使用了
data.frame
,因为它的输出看起来更好一些,但是可以省略。如果不需要问题中所示的精确输出形式,则可以稍微简化。这只使用dplyr

dat %>% 
  group_by(size) %>%
  group_modify(~ bind_rows(., summarize(., across(where(is.numeric), sum)))) %>%
  ungroup %>%
  mutate(category = coalesce(category, paste("Total", size)),
         size = if_else(startsWith(category, "Total"), "", size)) %>%
  data.frame
给予:

   size category store1 store2
1     L    shirt     52      2
2     L    pants      5      6
3     L      hat     37     12
4        Total L     94     20
5     M    shirt     10     24
6        Total M     10     24
7     S    shirt     22     43
8        Total S     22     43
9    XS    shirt      3     13
10   XS    pants     21     40
11      Total XS     24     53