我有一个在R中创建的汇总统计表。它对应于变量,列对应于不同的样本。我想使用xtable
包将此表导出到Latex。然而,有些变量的规模要大得多,所以我想对这些变量进行舍入。我尝试创建一个用户提供的输入到xtable的sanitize.text.函数来做到这一点:
dt <- data.table(sample1 = c(1.11, 2222.22), sample2 = c(3.33, 44444.44)) # data for MWE
rownames(dt) <- c('var 1', 'var 2')
xt <- print(xtable(dt),
format.args=list(big.mark=","),
sanitize.text.function = \(x) gsub('([0-9]+,[0-9]{3})\\.[0-9]{2}', '\\1', x))
# OUTPUT:
# \begin{table}[ht]
# \centering
# \begin{tabular}{rrr}
# \hline
# & sample1 & sample2 \\
# \hline
# var 1 & 1.11 & 3.33 \\
# var 2 & 2,222.22 & 44,444.44 \\
# \hline
# \end{tabular}
# \end{table}
字符串
然而,输出表中的变量并没有像我希望的那样四舍五入。在xtable
调用的输出上调用相同的gsub
函数可以工作:
gsub('([0-9]+,[0-9]{3})\\.[0-9]{2}', '\\1', xt)
[1] "\\begin{table}[ht]\n\\centering\n\\begin{tabular}{rrr}\n \\hline\n & sample1 & sample2 \\\\ \n \\hline\nvar 1 & 1.11 & 3.33 \\\\ \n var 2 & 2,222 & 44,444 \\\\ \n \\hline\n\\end{tabular}\n\\end{table}\n"
型
那么为什么这不能直接在print.xtable
的调用中工作呢?必须将gsub
的调用输出保存到xtable
对象上是一件痛苦的事情。
额外奖励:我正在尝试这种方法,因为据我所知,xtable
只允许我格式化整列的小数位数,而不是整行。任何允许我固定行小数位数的方法也可以解决我的问题。
2条答案
按热度按时间bwleehnv1#
sanitize.text.function
只适用于文本,而不是数字,所以要想让它像你期望的那样工作,你需要先将列转换为character
向量。但是这样你就不能使用像big.mark
这样的格式功能了。此外,依赖于字符串替换不是舍入,而是截断。您只保留数字的整数部分,例如,“1000.999999”变成“1000”。就个人而言,我会使用类似
signif
的东西,或者在将对象传递给xtable
之前更谨慎地使用round
:个字符
(note上面的代码在
data.table
上不起作用,因此我使用data.frame
)。然而,从上面的例子中可以看出,为了使用
big.mark
,要么让xtable
将所有内容都视为数字,并让它引入小数位,要么将所有列转换为字符,并在将data.frame
输入xtable
之前自己格式化它们。在一个稍微不相关的说明中,
siunitx
LaTeX包有一些你可能想要 checkout 的表格材料选项(包括自动舍入和不向整数添加十进制零)。py49o6xq2#
正如@ZéLoff的回答中所指出的,我需要将输入列转换为
character
以使用sanitize.text.function
。另一种方法是使用round
,floor
或trunc
对数字列进行预处理,这取决于所需的输出。然而,没有进一步的预处理,print.xtable
输出仍然包含尾随零,即使我已经四舍五入了输入。一个选项,如下所示,是将输入表转换为字符。但是,这样我就不能使用big.mark
来处理大数字。最好使用formatC
的参数来获得处理后的数字列,在输出表中看起来像我想要的那样。在这个例子中,它看起来像这样:
个字符