小计取决于 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中的新列?