小计取决于 r 中的多个列

Posted

技术标签:

【中文标题】小计取决于 r 中的多个列【英文标题】:Subtotal depending on multiple columns in r 【发布时间】:2019-12-17 15:37:00 【问题描述】:

这是一个测试表:

df <- read.table(text="
           str1 str2    name    t   y   x
             a  yes bas 23  323 21
             b  no  aasd    23  54  33
             a  no  asd 2   43  23
             b  yes hggf    43  123 55
             b  no  jgd 1   12  11
             b  yes qw  32  12  12
             a  yes rrrr    45  22  32
             a  no  ggg 121 11  43
             ",
             header = TRUE)

在here的帮助下,我们可以得到这样的小计

library(janitor)
library(purrr)
library(dplyr)
df<-df %>% 
  split(.[,"str1"]) %>% ## splits each change in cyl into a list of dataframes 
  map_df(., janitor::adorn_totals)

但我的问题是如何根据str2 内的组在每组列str1 中获得小计。它需要一个这样的数据框:

不胜感激

P.S 重要的是x 列在每个组中按降序排列

【问题讨论】:

【参考方案1】:

我们可以通过两列进行拆分,然后根据'str1'、'str2'中的值更改'Total'的名称

library(dplyr)
library(janitor)
library(purrr)
library(stringr)
df %>% 
   group_split(str1, str2) %>% 
   map_dfr(~ .x %>% 
        janitor::adorn_totals(.) %>% 
        mutate(str1 = replace(str1, n(), str_c(str1[n()], "_", 
           first(str1), "_", first(str2)))))

【讨论】:

【参考方案2】:

或者,使用与第一次拆分相同的语法,您可以这样做:

library(janitor)
library(purrr)
library(dplyr)
df %>% arrange(x) %>%
  split(.[,c("str2","str1")]) %>% 
  map_df(., janitor::adorn_totals)

  str1 str2 name   t   y  x
     a   no  asd   2  43 23
     a   no  ggg 121  11 43
 Total    -    - 123  54 66
     a  yes  bas  23 323 21
     a  yes rrrr  45  22 32
 Total    -    -  68 345 53
     b   no  jgd   1  12 11
     b   no aasd  23  54 33
 Total    -    -  24  66 44
     b  yes   qw  32  12 12
     b  yes hggf  43 123 55
 Total    -    -  75 135 67

【讨论】:

是否可以根据我们拥有的总数将这些总数命名为total1、total2、total3、total4,然后按照我的意愿对其进行操作?【参考方案3】:

如果您不介意“总”行的位置略有不同,可以使用data.table::rollup。带有NA 的行是由非NA 列的值标识的组的总计。

library(data.table)
setDT(df)

group_vars <- head(names(df), 3)
df_ru <- 
  rollup(df, j = lapply(.SD, sum), by = group_vars, 
         .SDcols = tail(names(df), 3))

setorderv(df_ru, group_vars)[-1]
#>     str1 str2 name   t   y   x
#>  1:    a <NA> <NA> 191 399 119
#>  2:    a   no <NA> 123  54  66
#>  3:    a   no  asd   2  43  23
#>  4:    a   no  ggg 121  11  43
#>  5:    a  yes <NA>  68 345  53
#>  6:    a  yes  bas  23 323  21
#>  7:    a  yes rrrr  45  22  32
#>  8:    b <NA> <NA>  99 201 111
#>  9:    b   no <NA>  24  66  44
#> 10:    b   no aasd  23  54  33
#> 11:    b   no  jgd   1  12  11
#> 12:    b  yes <NA>  75 135  67
#> 13:    b  yes hggf  43 123  55
#> 14:    b  yes   qw  32  12  12

由reprex package (v2.0.0) 于 2021-06-05 创建

【讨论】:

以上是关于小计取决于 r 中的多个列的主要内容,如果未能解决你的问题,请参考以下文章

如何将列中的所有数据移动到单个列(不合并),然后拆分为R中的新列?

如何使用 groupby 调整 pandas 中的小计列?

清除一张纸上一列中每一行的内容,取决于另一张纸上同一行中一列中的更改

VBA添加具有可变范围的小计

R中的ddply小计

R:data.table 中的透视和小计?