在 table 顶部添加带有数据集的行(stargazer R 包)

Add line with datasets at top of table (stargazer R package)

使用下面的代码,我设法生成下面的第一个 table。但是...

swiss2 <- swiss[1:20,]

m1 <- lm(Fertility ~ Agriculture, data = swiss)
m2 <- lm(Fertility ~ Examination, data = swiss)
m3 <- lm(Infant.Mortality ~ Education, data = swiss)
m4 <- lm(Infant.Mortality ~ Catholic, data = swiss)
m5 <- lm(Fertility ~ Agriculture, data = swiss2)
m6 <- lm(Fertility ~ Examination, data = swiss2)
m7 <- lm(Infant.Mortality ~ Education, data = swiss2)
m8 <- lm(Infant.Mortality ~ Catholic, data = swiss2)

stargazer(m1, m2, m3, m4, m5, m6, m7, m8,
          type = "latex",
          out="./table.tex",
          omit.stat=c("LL","ser","f","adj.rsq"), 
          font.size="tiny", 
          column.labels = c("(M1)", "(M2)", "(M3)", "(M4)", "(M5)", "(M6)", "(M7)", "(M8)"), 
          model.names = FALSE,
          model.numbers = FALSE,
          star.cutoffs = c(0.05, 0.01, 0.001),
          dep.var.labels = c("Outcome 1", "Outcome 2", "Outcome 1", "Outcome 2"))

...我宁愿在下面制作这个 table。唯一的区别是有一行而不是 "Dependent variable:" 行,有两列指示相关数据集 Swiss 和 Swiss2。我可以在 Latex 中手动执行此操作,但我 need/want 在 R 中直接破解,以便我的研究可以从 Rmarkdown 文件中完全重现。有想法吗?谢谢!

stargazer() 函数中,您引用的行由 dep.var.caption 选项控制。不幸的是,由于您需要这一行中的多个列,因此不进行一些修改就无法完成您想要的;如果将长度 > 1 的向量传递给此选项,stargazer() 将引发错误。因此,我们必须创建一个自定义函数来捕获 stargazer() 的输出并在打印之前对其进行相应的修改。

以下 .Rmd 文件对我来说工作正常(输出在代码下方):

---
title: "Stack Overflow Answer"
author: "duckmayr"
date: "November 3, 2017"
output: pdf_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

```{r, echo=FALSE}
custom_table <- function(dataset_labels, ...) {
    tbl <- capture.output(stargazer::stargazer(...))
    pattern1 <- 'Dependent variable:'
    pattern2 <- '(?<= \& ).+(?= \\)'
    first_row_index <- which(grepl(pattern=pattern1, x=tbl))
    first_row <- tbl[first_row_index]
    colspan <- as.numeric(gsub(pattern='[^0-9]+', replacement='', first_row))
    colspan <- colspan / length(dataset_labels)
    new_first_row <- sub('[0-9]+', colspan, first_row)
    replacement <- rep(stringr::str_extract(new_first_row, pattern2), 2)
    replacement <- stringr::str_replace(replacement, pattern1, dataset_labels)
    replacement <- paste(replacement, collapse=' & ')
    new_first_row <- stringr::str_replace(new_first_row, pattern2, replacement)
    new_first_row <- stringr::str_replace_all(new_first_row, 'multi', '\\multi')
    new_first_row <- stringr::str_replace_all(new_first_row, 'textit', '\\textit')
    tbl[first_row_index] <- new_first_row
    cat(tbl, sep='\n')
}
swiss2 <- swiss[1:20,]
m1 <- lm(Fertility ~ Agriculture, data = swiss)
m2 <- lm(Fertility ~ Examination, data = swiss)
m3 <- lm(Infant.Mortality ~ Education, data = swiss)
m4 <- lm(Infant.Mortality ~ Catholic, data = swiss)
m5 <- lm(Fertility ~ Agriculture, data = swiss2)
m6 <- lm(Fertility ~ Examination, data = swiss2)
m7 <- lm(Infant.Mortality ~ Education, data = swiss2)
m8 <- lm(Infant.Mortality ~ Catholic, data = swiss2)
```

```{r, echo=FALSE, results='asis'}
custom_table(c('Data: Swiss', 'Data: Swiss2'),
             m1, m2, m3, m4, m5, m6, m7, m8,
             type = "latex",
             header=FALSE,
             omit.stat=c("LL","ser","f","adj.rsq"), 
             font.size="tiny", 
             column.labels = c("(M1)", "(M2)", "(M3)", "(M4)", "(M5)", "(M6)", "(M7)", "(M8)"), 
             model.names = FALSE,
             model.numbers = FALSE,
             star.cutoffs = c(0.05, 0.01, 0.001),
             dep.var.labels = c("Outcome 1", "Outcome 2", "Outcome 1", "Outcome 2"))
```

编辑:

如果您希望输出到 tex 文件而不是(或除此之外)直接使用 .Rmd 文件中的输出,我们可以进行以下调整:

custom_table <- function(dataset_labels, ..., cat_output=TRUE, out_file=NULL) {
    tbl <- capture.output(stargazer::stargazer(...))
    pattern1 <- 'Dependent variable:'
    pattern2 <- '(?<= \& ).+(?= \\)'
    first_row_index <- which(grepl(pattern=pattern1, x=tbl))
    first_row <- tbl[first_row_index]
    colspan <- as.numeric(gsub(pattern='[^0-9]+', replacement='', first_row))
    colspan <- colspan / length(dataset_labels)
    new_first_row <- sub('[0-9]+', colspan, first_row)
    replacement <- rep(stringr::str_extract(new_first_row, pattern2), 2)
    replacement <- stringr::str_replace(replacement, pattern1, dataset_labels)
    replacement <- paste(replacement, collapse=' & ')
    new_first_row <- stringr::str_replace(new_first_row, pattern2, replacement)
    new_first_row <- stringr::str_replace_all(new_first_row, 'multi', '\\multi')
    new_first_row <- stringr::str_replace_all(new_first_row, 'textit', '\\textit')
    tbl[first_row_index] <- new_first_row
    if ( cat_output ) {
        cat(tbl, sep='\n')
    }
    if ( !is.null(out_file) ) {
        cat(tbl, sep='\n', file=out_file)
    }
}

然后如果你运行下面的代码在一个R脚本中,或者把它放在一个Rmd文件的块中,你将得到写入文件的输出'test_out.tex'以及直接输出:

custom_table(c('Data: Swiss', 'Data: Swiss2'),
             out_file='test_out.tex',
             m1, m2, m3, m4, m5, m6, m7, m8,
             type = "latex",
             header=FALSE,
             omit.stat=c("LL","ser","f","adj.rsq"), 
             font.size="tiny", 
             column.labels = c("(M1)", "(M2)", "(M3)", "(M4)", "(M5)", "(M6)", "(M7)", "(M8)"), 
             model.names = FALSE,
             model.numbers = FALSE,
             star.cutoffs = c(0.05, 0.01, 0.001),
             dep.var.labels = c("Outcome 1", "Outcome 2", "Outcome 1", "Outcome 2"))

使用 stargazer() 函数的 out 选项不会完全起作用,因为 stargazer() 会在我们有机会之前将输出写入 out对其进行修改,但此调整有效。