我正在使用 gt
包为我的数据创建汇总表。
最终,我需要三个表:
(column[n] / column[n-1] - 1)
我对第一张桌子没有任何问题。
library(gt)
# data for three groups over two years
d <- data.frame(
group = c("sg1","sg2","sg3","sg1","sg2","sg3","sg1","sg2","sg3"),
year = c(2020L,2020L,2020L, 2019L, 2019L,2019L, 2018L, 2018L,2018L),
value = c(1234, 4321, 12345, 1432, 4212, 13214, 1332, 4112, 13114)
)
#convert the data to a wide format with years as columns
d.wide <- reshape(d[order(d$year, decreasing = FALSE),],
varying = list(as.character(2018:2020)),
idvar = "group",
timevar = "year",
direction = "wide")
# construct the gt
my.gt <- gt(data = d.wide, rowname_col = "group") %>%
tab_row_group(
group = "Row Group A",
rows = c("sg1","sg2","sg3")
) %>%
fmt_number(
decimals = 0,
sep_mark = ",",
use_seps = TRUE,
columns = names(d.wide)
) %>%
summary_rows(
groups = TRUE,
columns = names(d.wide),
fns = c("Group Total" = "sum"),
decimals = 0
)
上面的代码创建了下表:
这是我正在寻找的内容的简化但准确的说明。在真实数据中,会有几个行组和几个年份列。我的解决方案需要灵活以适应不同数量的列(即,固定年数的硬编码不是理想的解决方案)。
我陷入困境的地方是计算出来的表 2 和表 3。我可以创建一个 d
版本,其中包含每个组/年份值的计算值(并且澄清一下,这个问题不是问如何在 data.frame 中计算这些值);但是,我希望 summary_rows
(例如“Group Total”)也显示 tab_row_group
的计算(例如“Row Group A”中的所有行)。
对于表 2(与前一年相比的百分比变化),该表将如下所示(注意 2018 年的省略,因为没有前一年可供比较。):
gt
功能允许您对汇总行使用用户定义的函数。
summary_rows(
...
fns = c("Group Total" = [USER FUNCTION]),
...
)
但我无法弄清楚这可能如何与相邻列的数据交互,也无法弄清楚如果表使用包含预先计算的百分比的 data.frame 数据可能是什么。
最后:除了喜欢 gt 在创建表 1 时的感觉和外观以及我花了两天时间熟悉该包之外,我愿意接受其他解决方案。
我的警告是展览将导出到 MS Word 并转换为 pdf。我的偏好是可以粘贴到 Word 文档中的矢量输出 (svg) 或(如在我当前的 gt_table 工作流程中)html。我知道高分辨率位图(即 png、jpeg 等)理论上应该具有足够的质量;但是,我在过去使用包含文本的位图时遇到了令人沮丧的经历(在 Word 中很好,但在转换为 pdf 时丢失了分辨率)。虽然我最初认为 html 是一种解决方法,但实际上我发现我喜欢这种格式,因为它让我可以灵活地在必要时对报告中的格式进行细微调整。
提前致谢。
安德鲁