R星探中的十进制数

R星探中的十进制数,r,stargazer,R,Stargazer,我正在使用R包stargazer生成Latex中的表。它工作得很好,但我不知道如何正确格式化我的数字。我希望所有数字都精确显示一位小数(例如1.0、0.1、10.5等)。因此,我使用选项digits=1。然而,对于像1这样的精确数字,我得到的是1,而不是1.0。即使是精确的数字(1.0而不是1),我如何获得小数点位?使用stargazer后,您可以使用正则表达式将小数点加回去。这里有一个例子。您可能需要稍微更改正则表达式字符串,具体取决于您使用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]+)”查找“&”,后跟一个数字字符串,后跟一个空格。然后,它用“&”、找到的同一组数字(使用//1)、句点(//。因为句点必须转义,因为它们在正则表达式中是特殊字符)、十进制零和空格来替换

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


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

感谢您推动了一个更加综合的答案,wolfsatthedoor。 我自己也对此感到疑惑了很长一段时间,看来《星探》的代码是故意这样写的

使用

trace(stargazer:::.stargazer.wrap, edit = T)
在第4485行显示
.summ.stat.publish.statistic
检查返回值
是否为.all.integers.
如果是这种情况,则最终值四舍五入为0位(硬编码)

(在打开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))
      }

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

很高兴这有帮助。顺便说一句,在我看来,你所追求的应该是stargazer的默认行为(或者至少是一个内置选项)。您可能会考虑将包保持器与此功能请求联系起来。这种方法不会得到错误的验证,例如0.49变成0.4?@ ANTTI——没有这样的效果。正则表达式不进行舍入。这已经由星探完成了。正则表达式所做的就是当stargazer将
10.0
打印为
10
时,它会将小数位加回打印
10.0
。Stargazer将向上舍入0.49。为什么Stargazer的输出不能自己完成呢?@dww我想知道您是否能够为
Stargazer
的HTML输出提供
gsub
?输出如下所示:
111141.492.214
,其中我尝试将小数点添加到111和14,但不添加到141.4,以提供替代函数?通常是的。不过,我要做的是,我有一个带有自定义代码的*.R文件,然后每次重新启动R会话(这并不经常发生)时调用trace(stargazer::.stargazer.wrap,edit=T),并将代码从*.R文件复制到打开的窗口并保存它。就我个人而言,这种小的变通方法并不能证明创建定制包并保持其最新是合理的。您可以在此处找到完整的自定义代码:@jnhh感谢您提供此自定义代码!你知道有没有什么方法可以自动执行
跟踪(stargazer::.stargazer.wrap,edit=T)
,然后执行后续的剪切和粘贴?@JNWHH,另外,当我尝试使用你的自定义代码
deparse可能是不完整的跟踪函数时,我收到了这个错误消息。stargazer.wrap“在包中”stargazer(未导出)[1]“.stargazer.wrap”
,并且输出不是固定的。您知道我可以尝试什么吗?
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} 
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))
      }