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 【问题描述】:我正在使用xtable
、rtable
和ReporteRs
的组合将各种对象(aov
、glm
'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
],带有辅助函数 table2doc
、table2ppt
和 table2html
,以将先前显示的 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 <- function(x) key <- 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 的问题在于它返回了一个需要单独处理的对象列表,看起来你已经整理好了。 lm
和 glm
返回一个带有 coefficient
叶子的列表。以上是关于R:将 p 值舍入到 xtable 中的两位有效数字,并将 ReporteRs 导出到 Latex/Office/LibreOffice的主要内容,如果未能解决你的问题,请参考以下文章
即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]