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

R:将p值四舍五入到xtable中的两个有效数字,并导出到Latex/Office/LibreOffice,r,export,xtable,significant-digits,reporters,R,Export,Xtable,Significant Digits,Reporters,我正在使用xtable、rtable和ReporteRs的组合,将各种对象的汇总表(aov、glm、lm等)导出到Latex/Word/Powerpoint。然而,我不太喜欢默认的方式,在这种方式中,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

我正在使用
xtable
rtable
ReporteRs
的组合,将各种对象的汇总表(
aov
glm
lm
等)导出到Latex/Word/Powerpoint。然而,我不太喜欢默认的方式,在这种方式中,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)
组=gl(2,10,20,标签=c(“Ctl”,“Trt”))
重量=c(控制、试验)
配合=lm(重量~组)
s=汇总(拟合)
s
系数:
估计标准误差t值Pr(>t)

(Intercept)4.8465 0.1557 31.124定义一个助手函数,该函数将查找p值的签名,我将其视为其中包含“Pr”的colname:


xtable2那么
xtable(s,digits=c(4,4,4,2,2),display=c('f','f','f','f','f','f','g'))呢(并不是所有的表都有p值列,而且它们有不同的列nrs)。最优雅的方法是什么?(这是我编写table2doc和Table2Pt的两个函数的一部分,用于将R对象导出到word或powerpoint中的表中,因此它充分处理所有可能的xtable输入对象非常重要)您可以编写一些小函数,根据fit对象的列名返回显示类型和数字,这本质上是一个查找表。例如
get\u display这很好-这正是我要找的-感谢数百万!!对于
lm
示例非常有效,但是对于
aov
I get
fit=aov(weight~group);s=summary(fit);as.FlexTable(xtable2(s))
rep(4,ncol+1)中的错误:无效的'times'参数
-
x['coverties']]]
不起作用-有什么想法如何修复吗?Ha使用
asdf=函数(x){if(长度(x)==1){as.data.frame(x[[1]}否则{lappy(unlist(x,FALSE),as.data.frame)};sm=asdf(s)
it-worksHa甚至更好
sm=xtable(x)
也可以工作,而且更通用,适用于任何受支持的x类!aov的问题是它返回一个需要单独处理的对象列表,您可以将其排序。
lm
glm
返回一个带有
系数的列表。
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
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