【发布时间】: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 在 Latex 中生成表格。它很好用,但我不知道如何正确格式化我的数字。我希望所有数字都精确显示一位小数(例如 1.0、0.1、10.5 等)。因此,我使用选项数字 = 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 生成的一些不同摘要格式可能包含您可能需要在搜索字符串中包含的其他内容,例如数字后跟空格以外的字符(例如逗号)。或者,在某些情况下,可能需要替换前面没有 & 的数字。
在任何情况下,一般方法都是相同的。
【讨论】:
10.0 和 10 一样,它加回小数位以打印 10.0。 Stargazer 将向上取整 0.49。
gsub 提供来自stargazer 的HTML 输出提供帮助?输出看起来像:<td>111</td><td>141.4</td><td>92.2</td><td>14</td>,我试图将小数添加到 111 和 14,但不添加到 141.4
感谢您推动更综合的答案,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}
【讨论】:
trace(stargazer:::.stargazer.wrap, edit =T)自动化,然后进行后续的剪切和粘贴吗?
deparse may be incompleteTracing function ".stargazer.wrap" in package "stargazer (not-exported)" [1] ".stargazer.wrap" 时,我收到此错误消息,并且输出未修复。你知道我可以尝试什么吗?
(在打开观星者的踪迹之前)如果要显示脚本中指定的所有数字,只需替换例如:
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 行中
【讨论】: