R:将 p 值舍入到 xtable 中的两位有效数字,并将 ReporteRs 导出到 Latex/Office/LibreOffice

Posted

技术标签:

【中文标题】R:将 p 值舍入到 xtable 中的两位有效数字,并将 ReporteRs 导出到 Latex/Office/LibreOffice【英文标题】:R : round p values to two significant digits in xtable and ReporteRs export to Latex/Office/LibreOffice 【发布时间】:2015-07-07 22:11:17 【问题描述】:

我正在使用xtablertableReporteRs 的组合将各种对象(aovglm's、lm's 等)的汇总表导出到 Latex/Word/微软幻灯片软件。但是,我不太喜欢默认方式,其中 p 值在逗号后以固定位数给出。相反,我希望它以与基本 R 函数 format.pval()digits=2 类似的格式为我提供 p 值,即,将 p 值四舍五入为两位有效数字 - 在本例中为 4.2e-17 和 0.25 )。

例如

ctl = c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt = c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group = gl(2, 10, 20, labels = c("Ctl","Trt"))
weight = c(ctl, trt)
fit = lm(weight ~ group)
s=summary(fit)
s

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   4.8465     0.1557  31.124   <2e-16 ***
group1        0.1855     0.1557   1.191    0.249    

library(xtable)
library(rtable)
library(ReporteRs)
tab=as.FlexTable(xtable(s))
tab

我希望以与summary(fit) 类似的方式格式化 p 值,但是(右对齐,四舍五入到两位有效数字,在本例中为 4.2e-17 和 0.25)。 任何人都知道如何以通用方式实现这一点,理想情况下对于xtable 支持的所有对象给出的 p 值?

编辑:在下面的帮助下,我现在制作了一个 [small package export],带有辅助函数 table2doctable2ppttable2html,以将先前显示的 R stats 对象导出到 Word、Powerpoint 或 HTML(以及函数 @987654340 @ 和 graph2doc 将当前活动的图表导出到 Powerpoint 或 Word),请参阅 https://cran.r-project.org/web/packages/export/index.html 和 https://github.com/tomwenseleers/export

【问题讨论】:

xtable(s, digits = c(4,4,4,2,2), display = c('f','f','f','f','g'))怎么样 谢谢 - 这在某种程度上解决了问题,尽管下一个问题是为 xtable 可以处理的所有对象重新定义这些默认参数(并非所有对象都有 p 值列,并且它们具有不同的 nrs 列)。最优雅的方法是什么? (这将是我正在编写 table2doc 和 table2ppt 将 R 对象导出到 word 或 powerpoint 中的表的两个函数的一部分,因此它充分处理所有可能的 xtable 输入对象很重要)跨度> 你可以编写小函数,根据 fit 对象的列名返回显示类型和数字,本质上是一个查找表。比如get_display &lt;- function(x) key &lt;- setNames(c('f','f','f','g'), c('Estimate','Std. Error','t value','Pr')); key[sapply(x, function(xx) grep(xx, names(key)))] get_display(colnames(s$coefficients)),我会像get_display(colnames(s$coefficients))一样使用它,这给了我上面的f,f,f,g。您可以使用类似的方法来设置数字 【参考方案1】:

定义一个辅助函数来查找 p 值的签名,我将其视为其中包含“Pr”的那些列名:

xtable2 <- function(x, ...)   sm <- x[['coefficients']]; ncol <- ncol(sm)
                             whch<- grep("Pr", colnames(sm))
                             digs <- rep(4, ncol+1); digs[whch+1] <- 2
                             disp <-rep("f", ncol+1); disp[whch+1] <- "g"
                  xtable(x, digits= digs, display=disp, ...) 

> tab <- as.FlexTable(xtable2(s)); tab

【讨论】:

太棒了——这正是我想要的——感谢数百万! 完美适用于 lm 示例,但对于 aov 我得到 fit = aov(weight ~ group); s=summary(fit); as.FlexTable(xtable2(s)) Error in rep(4, ncol + 1) : invalid 'times' argument - x[['coefficients']] 不起作用 - 有什么想法可以解决这个问题吗? 哈,asdf=function(x) if(length(x) == 1) as.data.frame(x[[1]]) else lapply(unlist(x, FALSE), as.data.frame) ; sm = asdf(s) 有效 Ha 甚至更好 sm=xtable(x)也可以工作并且更通用,适用于任何受支持的 x 类! aov 的问题在于它返回了一个需要单独处理的对象列表,看起来你已经整理好了。 lmglm 返回一个带有 coefficient 叶子的列表。

以上是关于R:将 p 值舍入到 xtable 中的两位有效数字,并将 ReporteRs 导出到 Latex/Office/LibreOffice的主要内容,如果未能解决你的问题,请参考以下文章

在java中将双精度值舍入为两位有效数字[重复]

即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]

如何优化 spark 函数以将双精度值舍入到小数点后 2 位?

java 正确地将java中的两个小数位舍入到两位小数

将双精度数舍入到 x 有效数字

如何在小数点后将 Dart 中的双精度数舍入到给定的精度?