R语言 如何在xtable的sanitize.text.function参数的用户提供的输入中使用gsub?

edqdpe6u  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(97)

我有一个在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只允许我格式化整列的小数位数,而不是整行。任何允许我固定行小数位数的方法也可以解决我的问题。

bwleehnv

bwleehnv1#

sanitize.text.function只适用于文本,而不是数字,所以要想让它像你期望的那样工作,你需要先将列转换为character向量。但是这样你就不能使用像big.mark这样的格式功能了。
此外,依赖于字符串替换不是舍入,而是截断。您只保留数字的整数部分,例如,“1000.999999”变成“1000”。就个人而言,我会使用类似signif的东西,或者在将对象传递给xtable之前更谨慎地使用round

dt <- data.frame(sample1 = c(1.11, 2222.22), sample2 = c(3.33, 44444.44))  # data for MWE
dt[dt>1000] <- as.character(round(dt[dt>1000], 0))
rownames(dt) <- c('var 1', 'var 2')
xt <- print(xtable(dt),
            format.args=list(big.mark=","))

个字符
(note上面的代码在data.table上不起作用,因此我使用data.frame)。
然而,从上面的例子中可以看出,为了使用big.mark,要么让xtable将所有内容都视为数字,并让它引入小数位,要么将所有列转换为字符,并在将data.frame输入xtable之前自己格式化它们。
在一个稍微不相关的说明中,siunitx LaTeX包有一些你可能想要 checkout 的表格材料选项(包括自动舍入和不向整数添加十进制零)。

py49o6xq

py49o6xq2#

正如@ZéLoff的回答中所指出的,我需要将输入列转换为character以使用sanitize.text.function。另一种方法是使用roundfloortrunc对数字列进行预处理,这取决于所需的输出。然而,没有进一步的预处理,print.xtable输出仍然包含尾随零,即使我已经四舍五入了输入。一个选项,如下所示,是将输入表转换为字符。但是,这样我就不能使用big.mark来处理大数字。最好使用formatC的参数来获得处理后的数字列,在输出表中看起来像我想要的那样。
在这个例子中,它看起来像这样:

dt <- data.table(sample1 = c(1.11, 2222.22), sample2 = c(3.33, 44444.44))  # data for MWE
round_cols <- c(1, 2)
dt[2, (round_cols) := lapply(.SD, round), .SDcols = round_cols]
rownames(dt) <- c('var 1', 'var 2')
xt <- print(xtable(dt),
            format.args=list(big.mark = ",",
                             drop0trailing = T),
            comment = F)

个字符

相关问题