R stargazer 中的小数

Decimal numbers in R stargazer

我正在使用 R 包 stargazer 在 Latex 中生成表格。效果很好,但我不知道如何正确格式化我的数字。我希望所有数字都精确显示一位小数(例如 1.0、0.1、10.5 等)。因此,我使用选项 digits = 1。但是,对于像 1 这样的精确数字,这给了我 1 而不是 1.0。即使是精确数字(1.0 而不是 1),我怎样才能得到小数位?

您可以在使用 stargazer 后使用正则表达式将小数位加回去。这是一个例子。您可能需要稍微更改正则表达式字符串,具体取决于您使用 stargazer 生成的摘要类型,但由于问题中没有包含最小示例,我能做的最好的就是给出此方法的通用示例:

star = stargazer(attitude, digits=1, digits.extra=1)
star = gsub("& ([0-9]+) ", "& \1\.0 ", star)

cat(star, sep = "\n")

# % Table created by stargazer v.5.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu
# % Date and time: Sat, Oct 08, 2016 - 8:11:26 PM
# \begin{table}[!htbp] \centering 
# \caption{} 
# \label{} 
# \begin{tabular}{@{\extracolsep{5pt}}lccccc} 
# \[-1.8ex]\hline 
# \hline \[-1.8ex] 
# Statistic & \multicolumn{1}{c}{N} & \multicolumn{1}{c}{Mean} & \multicolumn{1}{c}{St. Dev.} & \multicolumn{1}{c}{Min} & \multicolumn{1}{c}{Max} \ 
# \hline \[-1.8ex] 
# rating & 30.0 & 64.6 & 12.2 & 40.0 & 85.0 \ 
# complaints & 30.0 & 66.6 & 13.3 & 37.0 & 90.0 \ 
# privileges & 30.0 & 53.1 & 12.2 & 30.0 & 83.0 \ 
# learning & 30.0 & 56.4 & 11.7 & 34.0 & 75.0 \ 
# raises & 30.0 & 64.6 & 10.4 & 43.0 & 88.0 \ 
# critical & 30.0 & 74.8 & 9.9 & 49.0 & 92.0 \ 
# advance & 30.0 & 42.9 & 10.3 & 25.0 & 72.0 \ 
# \hline \[-1.8ex] 
# \end{tabular} 
# \end{table}

在此示例中,模式“& ([0-9]+)”查找“&”后跟一串数字,然后是 space。然后用“&”、它找到的同一组数字(使用 //1)、一个句点(//。因为句点必须转义,因为它们是正则表达式中的特殊字符)、一个十进制零和一个 space.

stargazer 生成的一些不同的摘要格式可能包含您可能需要包含在搜索字符串中的其他内容,例如数字后跟 space 以外的字符(例如逗号)。或者在某些情况下可能需要替换前面没有 & 的数字。

无论如何,一般方法是相同的。

感谢 wolfsatthedoor 推动更综合的答案。 我自己也想知道这个问题很长一段时间,看来 stargazer 代码是故意这样写的。

使用

查看源代码
trace(stargazer:::.stargazer.wrap, edit = T)

在 ~4485 行(根据确切版本可能略有不同)显示 .summ.stat.publish.statistic 检查返回值是否 .is.all.integers. 如果是,则最终值四舍五入为 0 位(硬编码)。

else if (which.statistic == "median") {
        median.value <- median(temp.var, na.rm = TRUE)
        if (.is.all.integers(temp.var) == FALSE) {
          how.much.to.round <- .format.s.round.digits
        }
        else {
          if (.is.all.integers(median.value) == TRUE) {
            how.much.to.round <- 0
          }
          else {
            how.much.to.round <- 1
          }
        }
        return(.iround(median.value, how.much.to.round))
      }

要更改此行为,您必须将所有 how.much.to.round 更改为 .format.s.round.digits,这是使用 digits 命令指定的值。您必须在 ~4510 到 4570 行中分别对所有汇总统计信息(即中位数、最小值、最大值和 p)执行此操作。这也确保了 N 列不包含不必要的数字。

保存的自定义观星器函数应如下所示(注意:每次重新启动 R-Session 时,您都必须重新进行更改 - 您可以通过导出函数来防止这种情况):

stargazer((cbind(A = c(1,1,1,1), B = c(3,4,3,3))), summary = T, digits = 2, header = F, type = "text")
# ===================================
# Statistic N Mean St. Dev. Min  Max 
# -----------------------------------
# A         4 1.00   0.00   1.00 1.00
# B         4 3.25   0.50   3.00 4.00
# -----------------------------------

stargazer((cbind(A = c(1,1,1,1), B = c(3,4,3,3))), summary = T, digits = 2, header = F)
# \begin{table}[!htbp] \centering 
#   \caption{} 
#   \label{} 
# \begin{tabular}{@{\extracolsep{5pt}}lccccc} 
# \[-1.8ex]\hline 
# \hline \[-1.8ex] 
# Statistic & \multicolumn{1}{c}{N} & \multicolumn{1}{c}{Mean} & \multicolumn{1}{c} {St. Dev.} & \multicolumn{1}{c}{Min} & \multicolumn{1}{c}{Max} \ 
# \hline \[-1.8ex] 
# A & 4 & 1.00 & 0.00 & 1.00 & 1.00 \ 
# B & 4 & 3.25 & 0.50 & 3.00 & 4.00 \ 
# \hline \[-1.8ex] 
# \end{tabular} 
# \end{table} 

(在打开 stargazer 的踪迹之前)如果你想显示脚本中指定的所有数字,只需替换例如:

else if (which.statistic == "min") {
        if (.is.all.integers(temp.var) == FALSE) {
          how.much.to.round <- .format.s.round.digits
        }
        else {
          how.much.to.round <- .format.s.round.digits
        }
        return(.iround(min(temp.var, na.rm = TRUE), 
                       how.much.to.round))
      }

替换为:

   else if (which.statistic == "min") {
        return(.iround(min(temp.var, na.rm = TRUE), .format.s.round.digits))
      }

您可以将最小值替换为最大值等。这大约在第 4530-4576 行