【问题标题】:transforming dplyr output for PDF formatting with headings将 dplyr 输出转换为带有标题的 PDF 格式
【发布时间】:2018-10-11 11:59:13
【问题描述】:

我正在使用 Rstudio 笔记本。 我创建了一个 dplyr 汇总输出,现在我想将其转换为更易读的输出:

df %>%
  group_by(y) %>%
  dplyr::summarise_all(funs(count = n(),
                           mean = mean, 
                           stdev = sd, 
                           min = min, 
                           max = max, 
                           median = median,
                           iqr = IQR,
                           q25 = quantile(., probs = 0.25),
                           q75 = quantile(., probs = 0.75)
                       ))

输出明智我得到这样的东西:

y   x1_count    x2_count    x3_count    x1_mean x2_mean x3_mean
0   380081       380081      380081       10       12     36
1   19906         19906       19906        5        8     93

我的问题是:我怎样才能把它变成:

        count           mean    
    y = 0   y = 1   y = 0   y = 1
x1  380081  19906    10       5
x2  380081  19906    12       8
x3  380081  19906    36      93

我尝试了转置,但根本没有得到我想要的结果。

【问题讨论】:

  • 你打算如何使用它?像您可能在 Excel 表格中使用的标题格式(即计数和平均值)并不能真正转换为 R,在 R 中,您通常会为每列使用一个列名。但是既然你提到了笔记本,你是不是想格式化成 PDF 格式的打印表格?在这种情况下,我用kableExtra 做了类似的标题
  • 嗨,我知道这不会在 r 中翻译,但我需要在打印的表格中使用 pdf 和 html 格式的报告以进行演示。
  • 好的,这是一个不同的问题——您实际上是在询问如何重塑数据,然后将其格式化为组合标题,可能使用像 kableExtra 或 @987654326 这样的相当专业的包@
  • 是的。在我看来,首先重塑表格本身然后进行格式设置听起来更明显。不知道其他选择是可能的。仍在学习吸收 R 语言中的所有可能性,这些可能性在一开始是压倒性的。

标签: r dplyr r-markdown transpose


【解决方案1】:

就像我在评论中指出的那样,这实际上是一个由两部分组成的问题:一个是关于重塑数据的,但它的关键在于使用 PDF 输出的标题进行格式化。您正在寻找的输出不是您通常会在 R 中实现的输出——您正在尝试获取重复的列名,然后是它们上方的标题。因此,这是一个特别的 RMarkdown 问题,因为您正在尝试以这种非标准格式编织成 PDF。

第一部分是重塑。您可以通过将数据变成长形状,将x1_count 等拆分为x1countseparate 来做到这一点。然后,您可以用mutatepasteunite 标记y = 0,将这些值放在一起形成count_y = 0 之类的列名,然后将其恢复为宽格式,如下所示。

library(tidyverse)

df %>%
  gather(key = x_measure, value = val, -y) %>%
  separate(x_measure, into = c("x", "measure"), sep = "_") %>%
  mutate(y = paste("y =", y)) %>%
  unite(key, measure, y) %>%
  spread(key = key, value = val)
#> # A tibble: 3 x 5
#>   x     `count_y = 0` `count_y = 1` `mean_y = 0` `mean_y = 1`
#>   <chr>         <int>         <int>        <int>        <int>
#> 1 x1           380081         19906           10            5
#> 2 x2           380081         19906           12            8
#> 3 x3           380081         19906           36           93

第二部分是准备编织。有几个包可以让你创建这些类型的打印表格——我最熟悉kableExtra,但也有huxtablextable,可能还有其他几个。这是 RMarkdown 的 sn-p,我将使用 kableExtra 来执行此操作。

我正在使用rename_allstr_remove 去除count_y = 0 中的count_ 之类的位。为了重塑,我仍然需要一种方法来保持列名的唯一性,但现在我可以删除这些名称的部分。

然后kableExtra::kable_stylingkableExtra::add_header_above 允许您使用第二级标题进行打印。我建议通过vignettes,因为他们非常彻底。

---
title: "Table with headings"
output: pdf_document
---

```{r echo=FALSE, message=FALSE, warning=FALSE}
library(tidyverse)
library(knitr)
library(kableExtra)

df %>%
  gather(key = x_measure, value = val, -y) %>%
  separate(x_measure, into = c("x", "measure"), sep = "_") %>%
  mutate(y = paste("y =", y)) %>%
  unite(key, measure, y) %>%
  spread(key = key, value = val) %>%
  rename_all(str_remove, "^[a-z]+_") %>%
  kable(booktabs = T) %>%
  kable_styling() %>%
  add_header_above(c(" " = 1, "count" = 2, "mean" = 2))
```

编织这个得到一个PDF:

【讨论】:

  • 感谢您的明确解释、时间和帮助。很有帮助
【解决方案2】:

这是一种选择:

df = read.table(text = "
y   x1_count    x2_count    x3_count    x1_mean x2_mean x3_mean
0   380081       380081      380081       10       12     36
1   19906         19906       19906        5        8     93
", header=T)

library(tidyverse)

df %>%
  gather(col,value,-y) %>%
  separate(col, c("x","metric")) %>%
  mutate(metric = paste0(metric, " for y = ", y)) %>%
  select(-y) %>%
  spread(metric, value)

#    x count for y = 0 count for y = 1 mean for y = 0 mean for y = 1
# 1 x1          380081           19906             10              5
# 2 x2          380081           19906             12              8
# 3 x3          380081           19906             36             93

【讨论】:

  • 嗨,感谢您的回复和时间!由于我对 R 比较陌生,因此用这么少的代码可以实现的效果令人印象深刻。我尝试了您的代码,但现在出现错误:行的重复标识符。
  • 嗨,我解决了!有一个带有下划线的变量名。感谢您的帮助和时间!非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2017-10-15
  • 2019-01-03
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多