将dplyr输出转换为带标题的PDF格式

时间:2018-10-11 11:59:14

标签: r dplyr r-markdown transpose

我正在使用Rstudio笔记本。 我已经创建了一个dplyr summary输出,现在我想将其转换为更具可读性的输出:

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

我尝试移调,但根本没有得到想要的结果。

2 个答案:

答案 0 :(得分:1)

这里是一个选择:

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

答案 1 :(得分:1)

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

第一部分是重塑。您可以通过以下方式实现此目的:将数据变成长形,然后用security.protocol=SSL x1_count等分成x1count。然后,您可以使用separatey = 0mutate来标记paste,将这些值放在一起,以得到unite这样的列名,然后将其回到下面看到的宽格式。

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 最熟悉,但是还有huxtablextable以及其他一些软件包。这是RMarkdown的一个片段,我将用它来与kableExtra一起使用。

我正在使用kableExtrarename_all来摆脱str_remove中类似count_的位。为了重塑,我仍然需要一种方法来保持列名的唯一性,但是现在我可以删除名称的那些部分。

然后使用count_y = 0kableExtra::kable_styling进行第二级标题打印。我建议您仔细阅读vignettes,因为它们非常详尽。

kableExtra::add_header_above

编织后可得到带有以下内容的PDF:

enter image description here