使用 stargazer 获取科学记数法的另一种可靠方法是破解digit.separator
参数。此选项允许用户指定分隔小数的字符(.
在大多数语言环境中通常是句点)。我们可以篡夺这个参数,将一个唯一可识别的字符串插入到我们希望能够使用正则表达式找到的任何数字中。以这种方式搜索数字的优点是我们只能找到与 stargazer 输出中的数值相对应的数字。即,不可能同时匹配作为变量名一部分的数字(例如 X_12345)或作为乳胶格式化代码的一部分(例如\hline \\[-1.8ex]
)。在下面我使用字符串::::
,但是我们在表中其他地方找不到的任何唯一字符串(例如哈希)都可以。最好避免在标识符标记中包含任何特殊的正则表达式字符,因为这会使事情稍微复杂化。
m1
使用其他答案中的示例模型。
mark = '::::'
star = stargazer(m1, header = F, decimal.mark = mark, digit.separator = '')
replace_numbers = function(x, low=0.01, high=1e3, digits = 3, scipen=-7, ...) {
x = gsub(mark,'.',x)
x.num = as.numeric(x)
ifelse(
(x.num >= low) & (x.num < high),
round(x.num, digits = digits),
prettyNum(x.num, digits=digits, scientific = scipen, ...)
)
}
reg = paste0("([0-9.\\-]+", mark, "[0-9.\\-]+)")
cat(gsubfn(reg, ~replace_numbers(x), star), sep='\n')
更新
如果要确保在科学记数法中保留尾随零,那么我们可以使用sprintf
prettyNum 来代替。
像这样
replace_numbers = function(x, low=0.01, high=1e3, digits = 3) {
x = gsub(mark,'.',x)
x.num = as.numeric(x)
form = paste0('%.', digits, 'e')
ifelse(
(abs(x.num) >= low) & (abs(x.num) < high),
round(x.num, digits = digits),
sprintf(form, x.num)
)
}