R星探中的十进制数
我正在使用R包stargazer生成Latex中的表。它工作得很好,但我不知道如何正确格式化我的数字。我希望所有数字都精确显示一位小数(例如1.0、0.1、10.5等)。因此,我使用选项digits=1。然而,对于像1这样的精确数字,我得到的是1,而不是1.0。即使是精确的数字(1.0而不是1),我如何获得小数点位?使用stargazer后,您可以使用正则表达式将小数点加回去。这里有一个例子。您可能需要稍微更改正则表达式字符串,具体取决于您使用stargazer生成的摘要类型,但由于问题中不包含最小示例,因此我只能给出此方法的一般示例: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生成的摘要类型,但由于问题中不包含
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))
}