【问题标题】:Decimal numbers in R stargazerR stargazer中的十进制数
【发布时间】:2016-10-08 21:08:01
【问题描述】:

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

【问题讨论】:

    标签: r stargazer


    【解决方案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]+)” 查找“&”,后跟一串数字,后跟一个空格。然后将其替换为“&”,它找到的同一组数字(使用 //1),句点(//. 因为句点必须被转义,因为它们是正则表达式中的特殊字符),十进制零和空格.

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

    在任何情况下,一般方法都是相同的。

    【讨论】:

    • 很高兴这有帮助。顺便说一句,在我看来,你所追求的应该是 stargazer 的默认行为(或者至少是一个内置选项)。您可以考虑与包维护者联系并提出功能请求。
    • 这种方法不会舍入错误,例如0.49 变成 0.4?
    • @Antti - 不,这按预期工作。正则表达式不进行舍入。这已经由观星者完成了。正则表达式所做的只是当 stargazer 打印例如10.010 一样,它加回小数位以打印 10.0。 Stargazer 将向上取整 0.49。
    • 为什么观星输出不能自己做?
    • @dww 我想知道您是否能够为gsub 提供来自stargazer 的HTML 输出提供帮助?输出看起来像:<td>111</td><td>141.4</td><td>92.2</td><td>14</td>,我试图将小数添加到 111 和 14,但不添加到 141.4
    【解决方案2】:

    感谢您推动更综合的答案,wolfsatthedoor。 我自己对这个问题想了很长一段时间,看来观星者的代码是故意这样写的。

    查看源代码

    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} 
    

    【讨论】:

    • 可以提供替代功能吗?
    • 一般来说,是的。不过,我所做的是我有一个带有自定义代码的 *.R 文件,然后每次重新启动我的 r 会话时我都会调用 trace(stargazer:::.stargazer.wrap, edit = T) (这不会发生经常)并将代码从 *.R 文件复制到打开的窗口并保存。就我个人而言,这种小变通方法并不能证明创建自定义包并使其保持最新的合理性。您可以在此处找到完整的自定义代码:github.com/op-two/stargazer_custom/blob/master/…
    • @JNWHH 感谢您提供此自定义代码!你知道有什么办法可以让trace(stargazer:::.stargazer.wrap, edit =T)自动化,然后进行后续的剪切和粘贴吗?
    • @JNWHH,另外,当我尝试使用您的自定义代码 deparse may be incompleteTracing function ".stargazer.wrap" in package "stargazer (not-exported)" [1] ".stargazer.wrap" 时,我收到此错误消息,并且输出未修复。你知道我可以尝试什么吗?
    【解决方案3】:

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

    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))
          }
    

    您可以将 min 替换为 max 等。这大约在第 4530-4576 行中

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 2017-10-15
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多