【问题标题】:function for creating a summary table from sales data从销售数据创建汇总表的功能
【发布时间】:2021-06-29 05:29:10
【问题描述】:

我正在寻找创建汇总表的函数,我可以在其中将表作为输入参数传递并创建如下所示的汇总,我正在尝试使用 dcast 创建,但无法使其对变量进行动态化。

示例数据框

target <- c("DT 0", "DT 1", "DT 2", "DT 3", "DT 4", "DT 5", "DT 6", "DT 7", "DT 8")
basic <- c(19,50,79,80,72,30,13,45,52)
beginner <- c(22,82,50,15,51,54,40,17,31)
medium <- c(18,66,29,32,40,34,57,60,84)
projected <- c(38,63,17,64,81,41,14,63,79)
Planned <- c(53,12,73,34,16,77,12,60,88)
df <- data.frame(target,basic,beginner,medium,projected,Planned)
df <- as.data.frame(t(df))

所需的输出应如下所示

【问题讨论】:

  • 我不确定我是否完全理解您想要的汇总表。您只需要basicplanned 列?
  • 是的,只有基本和计划列行,列将是 Dt 0,DT 5。DT 8

标签: r kable kableextra


【解决方案1】:

你可以使用:

library(dplyr)
library(tidyr)

df %>%
  select(target, basic, Planned) %>%
  pivot_wider(names_from = target, values_from = c(basic, Planned), 
              names_glue = '{target}_{.value}') %>%
  select(order(stringr::str_extract(names(.), 'DT \\d+')))

如果您使用的是数据的转置版本,请使用以下代码。

df %>%
  rownames_to_column('val') %>%
  filter(val %in% c('target', 'basic', 'Planned')) %>%
  t %>%
  as.data.frame() %>%
  setNames(.[1, ]) %>%
  slice(-1) %>%
  pivot_wider(names_from = target, values_from = c(basic, Planned), 
              names_glue = '{target}_{.value}') %>%
  select(order(stringr::str_extract(names(.), 'DT \\d+')))

R 数据框不能有多个标题,如果您希望输出看起来与显示的完全一样,您可以查看 knitr::kablegt::gt 之类的函数以及其他显示漂亮表格的函数。

【讨论】:

  • 实际数据是原始df的转换版本
  • 我亲爱的朋友@Ronak Shah 你知道我怎样才能摆脱第二排的那些DT \\d+。每当我尝试删除它们时,由于列名重复而引发错误。
  • @AnoushiravanR 是的,小标题中不能有重复的列名。
  • @user14176250 这是不寻常的格式。您可以查看我更新的答案,该答案适用于数据的转置版本。不幸的是,我没有melt 的解决方案。
  • @RonakShah 所以我无法解决这个问题。
【解决方案2】:

这是我能想到的最好的方法,但是到目前为止我还不能从第二个标题中删除 DT_ 部分,因为名称应该是唯一的并且它会抛出错误。我会尽快弄明白的。

library(dplyr)
library(tidyr)
library(kableExtra)

df %>% 
  pivot_longer(- target, names_to = "summary", values_to = "Banking") %>%
  filter(summary %in% c("basic", "Planned"),
         target %in% c("DT 0", "DT 5", "DT 8")) %>%
  pivot_wider(names_from = c("target", "summary"), values_from = Banking) %>%
  mutate(`Sales Review` = "Banking") %>%
  relocate(`Sales Review`) %>%
  kbl() %>%
  kable_classic() %>%
  add_header_above(c(" "= 1, "DT 0" = 2, "DT 5" = 2, "DT 8" = 2))


这是输出

【讨论】:

  • 感谢您的帮助,这是我一直在寻找的相同答案,但我唯一需要将名称 DT 0_basic、DT 5_basic 更新为仅 Basic 和 DT 0_Planned、DT 5_Planned 仅更新为计划
  • 我知道,我正在考虑它,但我无法删除它,因为列名不能是重复值。让我看看我能做什么。
  • 我几乎可以用任何东西替换它,但必须有一些东西并且它不接受重复值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
相关资源
最近更新 更多