【问题标题】:How to approach the generation of tables based on conditionals using xtable如何使用 xtable 根据条件生成表
【发布时间】:2017-07-07 21:27:07
【问题描述】:

我只是在开始使用xtable 或`stargazer 之类的软件包。 Bellow 是一个示例数据集,原始数据集要大得多。

set.seed(1)
df <- data.frame(rep(
    sample(c(2012,2016),10, replace = T)),
    sample(c('Treat','Control'),10,replace = T),
    runif(10,0,1),
    runif(10,0,1),
    runif(10,0,1))

colnames(df) <- c('Year','Group','V1','V2','V3')

我想生成格式良好的表格,以显示上述数据集的描述性统计信息。

但是,有没有办法xtable 可以直接生成一个表格,在该表格中我可以看到整个数据集的统计数据,按组(治疗和控制)和年份(2012 年、2016 年)分开?或者甚至可以通过组合组和年份?

或者我应该根据这些设置过滤原始df并在每个上运行xtable

我想要的另一件事是显示变量的中位数,而不是显示均值,以及其他统计信息。有可能吗,还是我必须使用 R 手动计算?

任何考虑stargazer 的解决方案都是有效的!

谢谢!

【问题讨论】:

    标签: r format xtable stargazer kableextra


    【解决方案1】:

    以下是您可以在 rmarkdown 文档中执行的操作的一些示例,尽管您可以比我在此处所做的更进一步设置表格格式。我已经包含了一些使用xtable 的示例,然后是一些使用新的kableExtra 包的示例,除非您已经熟练使用latex,否则与@987654331 相比,它可以更轻松地格式化复杂的表格布局@。有关更多信息,请参阅 xtablekableExtra 的小插图。

    为了汇总和重塑数据,我使用了 dplyrtidyr 包(它们是 tidyverse 包套件的一部分)中的函数。您还可以使用基本 R 函数(例如 aggregatereshape 以及 data.table 包)进行汇总和重塑。

    rmarkdown文档

    ---
    title: "Tables"
    author: "eipi10"
    date: "7/7/2017"
    output: pdf_document
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo=FALSE, warning=FALSE)
    library(xtable)
    options(xtable.comment=FALSE, xtable.include.rownames=FALSE)
    library(tidyverse)
    ```
    
    ```{r}
    set.seed(1)
    df <- data.frame(Year=rep(
        sample(c(2012,2016), 10, replace = T)),
        Group=sample(c('Treat','Control'),10,replace = T),
        V1=runif(10,0,1),
        V2=runif(10,0,1),
        V3=runif(10,0,1))
    ```
    
    ```{r, results="asis"}
    # Mean by Year and Group
    summary.table = df %>% 
                   group_by(Year, Group) %>%
                   summarise_all(funs(mean))
    
    print(xtable(summary.table, 
                 caption="Mean by Year and Group",
                 digits=c(1,0,0,2,2,2)))
    ```
    
    ```{r, results="asis"}
    # Median by Year and Group
    summary.table = df %>% 
                   group_by(Year, Group) %>%
                   summarise_all(funs(median))
    
    print(xtable(summary.table, 
                 caption="Median by Year and Group",
                 digits=c(1,0,0,2,2,2)))
    ```
    
    ```{r, results="asis"}
    # Mean and Median by Year and Group
    summary.table = df %>% 
                   group_by(Year, Group) %>%
                   summarise_all(funs(mean, median))
    
    print(xtable(summary.table, 
                 caption="Mean and Median by Year and Group",
                 digits=c(1,0,0,rep(2,6))))
    ```
    
    ```{r}
    # Create a function that takes the summary function calls as arguments
    xtab_fnc = function(data, caption, ...) {
    
      # quosure to dispatch functions properly (see Programming with dplyr vignette)
      funcs = quos(...)
    
      summary.table = data %>% 
        group_by(Year, Group) %>%
        summarise_all(funs(!!!funcs))
    
      # Get rid of repeated years
      for(i in nrow(summary.table):2) {
        if(identical(summary.table$Year[i-1], summary.table$Year[i])) {
          summary.table$Year[i] = ""
        }
      }
    
      xtable(summary.table, 
             caption=caption,
             digits=c(1,0,0,rep(2,ncol(summary.table) - 2)))
    }
    ```
    
    ```{r, results="asis"}
    # Run the function
    print(xtab_fnc(df, "Mean, Median, and Sum by Year and Group", mean, median, sum),
          size="scriptsize")
    ```
    
    ```{r, results="asis"}
    # Run the function
    print(xtab_fnc(df, "Mean by Year and Group", mean),
          size="large")
    ```
    
    ```{r}
    # You can do more complex formatting in xtable, but it's probably easier with kableExtra
    library(knitr)
    library(kableExtra)
    ```
    
    ```{r}
    summary.table = df %>% 
      group_by(Year, Group) %>%
      summarise_all(funs(mean,sd,min,median,max))
    
    # Get rid of repeated years
    for(i in nrow(summary.table):2) {
      if(identical(summary.table$Year[i-1], summary.table$Year[i])) {
        summary.table$Year[i] = ""
      }
    }
    
    # Get rid of "_mean", and "_median" in column names
    names(summary.table) = gsub("_.*","",names(summary.table))
    
    # LaTeX Table
    kable(summary.table, format = "latex", 
          booktabs = T, caption = "kableExtra to format spanning columns",
          digits=c(0,0,rep(3,15))) %>%
      kable_styling(latex_options = c("striped", "hold_position", "scale_down"),
                    full_width=F) %>%
      add_header_above(c("","","Mean"=3,"SD"=3,"Min"=3,"Median[note]"=3,"Max"=3)) %>%
      add_footnote(c("Note, means and medians are often the same with this data."))
    ```
    
    ```{r}
    # Reshape table to turn V1-V3 into rows
    summary.table = df %>% 
      group_by(Year, Group) %>%
      summarise_all(funs(mean,sd,min,median,max)) %>% 
      gather(key, value, -Year, -Group) %>%
      separate(key, into=c("var", "stat")) %>%
      unite(stat_Group, stat, Group) %>%
      spread(stat_Group, value) 
    
    # Get rid of repeated years
    for(i in nrow(summary.table):2) {
      if(identical(summary.table$Year[i-1], summary.table$Year[i])) {
        summary.table$Year[i] = ""
      }
    }
    
    names(summary.table) = gsub(".*_", "", names(summary.table))
    
    # LaTeX Table
    kable(summary.table, format = "latex", 
          booktabs = T, caption = "kableExtra to format spanning columns",
          digits=c(0,0,rep(3,10))) %>%
      kable_styling(latex_options = c("striped", "hold_position", "scale_down"),
                    full_width=F) %>%
      add_header_above(c("","","Max"=2,"Mean"=2,"Median"=2,"Min"=2,"SD"=2)) 
    ```
    
    ```{r}
    # Reshape table to turn V1-V3 into rows; also add a column summarizing all subjects
    summary.table = df %>% 
      group_by(Year, Group) %>%
      summarise_all(funs(mean,sd,min,median,max)) %>% 
      bind_rows(df %>%                                              # bind_rows block adds the "All" column
                  mutate(Group="All") %>%                           # | 
                  group_by(Year, Group) %>%                         # |
                  summarise_all(funs(mean,sd,min,median,max))) %>%  # |
      gather(key, value, -Year, -Group) %>%
      separate(key, into=c("var", "stat")) %>%
      unite(stat_Group, stat, Group) %>%
      spread(stat_Group, value) 
    
    # Get rid of repeated years
    for(i in nrow(summary.table):2) {
      if(identical(summary.table$Year[i-1], summary.table$Year[i])) {
        summary.table$Year[i] = ""
      }
    }
    
    names(summary.table) = gsub(".*_", "", names(summary.table))
    
    # LaTeX Table
    kable(summary.table, format = "latex", 
          booktabs = T, caption = "kableExtra to format spanning columns; also add an 'All' column",
          digits=c(0,0,rep(3,15))) %>%
      kable_styling(latex_options = c("striped", "hold_position", "scale_down"),
                    full_width=F) %>%
      add_header_above(c("","","Max"=3,"Mean"=3,"Median"=3,"Min"=3,"SD"=3)) 
    ```
    

    PDF 输出文件

    【讨论】:

    • 谢谢!但是有没有一种方法可以让包裹给我它通常给出的其他统计数据。例如:标准偏差,最小值,最大值。中位数,而不是平均值?
    • 是的,只需将这些函数传递给summarise_all 中的funs()。我已将这些摘要函数添加到最后一个示例(使用 kableExtra 包将表格呈现为 Latex 的示例)。
    • 其实更新答案中的最后两个例子。
    • 在将表格提供给xtable 之前,将其调整为您想要的形式。我的回答有几个数据重塑的例子,但请查看dplyrtidyr 小插图,了解有关使用tidyverse 函数执行此操作的更多信息。您还可以使用data.table 包或aggregatereshape 等基本R 函数来汇总和重塑数据。
    • 我在rmarkdown 文档的末尾添加了另一个代码块,以展示为整个示例添加列的一种方法。这实际上是一项数据汇总和重塑任务,并非特定于 xtable 等输出函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多