抑制矩阵和循环函数中的列名

时间:2013-10-01 18:00:21

标签: r function xtable psych

我正在尝试在R中创建我的第一个自定义函数(是的!)。我现在有一些类似的东西,但我认为它可以改进。

基本上,我想在R中创建自己的自定义表,可以通过xtable运行最终报表。我希望表格对每一列都遵循这种格式:

group1mean,group1sd,group2mean,group2sd,t-value,p-value。

目前,我的功能就是这样做的。但是,它会产生我想留空的列名(例如V3和V4),我想让它循环遍历多个因变量并自动将结果作为新行追加到矩阵中。现在,我必须手动为每个因变量写一行代码(在下面的例子中,DV是PWB,SWB和EWB。

到目前为止,这是我的代码:

data <- read.delim("~/c4044sol.txt", header=T)

library(psych)

proc.ttest <- function(dv,group,decimals) {

    x1 <- describeBy((dv), (group), mat=TRUE)
    stat1 <- t.test((dv) ~ (group))
    output1 <- c(paste (round(x1$mean[1], digits=(decimals)),"(", round(x1$sd[1], digits=    (decimals)), ")", sep =" "),
           paste (round(x1$mean[2], digits=(decimals)), "(", round(x1$sd[2], digits=(decimals)), ")", sep =" "),
           round(stat1$statistic, digits=2), round(stat1$p.value, digits=3))

    return(output1) 
}

toprow <- c("M (SD)", "M (SD)", "t", "p")

outtable <- rbind(toprow,
              proc.ttest(data$PWB, data$college, 2),
              proc.ttest(data$SWB, data$college, 2),
              proc.ttest(data$EWB, data$college, 2))


colnames(outtable) <- c("College graduate", "Less than college graduate", "", "")
row.names(outtable) <- c("", "PWB", "SWB", "EWB")

library(xtable)
xtable(outtable)

所以重复一下,我想压缩列名“V3”和“V4”(将它们留空)并使代码在变量列表上自动运行。这两件事都有可能吗?谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

尽量保留outtable,但没有toprow。 相反,请使用toprow作为名称:

toprow <- c("M (SD)", "M (SD)", "t", "p")

outtable <- rbind( # toprow,
              proc.ttest(data$PWB, data$college, 2),
              proc.ttest(data$SWB, data$college, 2),
              proc.ttest(data$EWB, data$college, 2))

names(outtable) <- toprow
## note that the parens and spaces are 
##   not best practices, but this should still
##   get your your desired results

答案 1 :(得分:0)

我修改了额外的列标签打印问题,将最终表格中我想要的所有标签放在矩阵的前两行......

toptoprow <- c("College graduate", "Less than college graduate", "", "")
toprow <- c("M (SD)", "M (SD)", "t", "p")


outtable <- rbind(toptoprow,toprow, proc.ttest(PWB, college, 2),
              proc.ttest(SWB, college, 2),
              proc.ttest(EWB, college, 2))

然后使用打印功能(如里卡多所建议的那样)抑制这些名字......

print(xtable(outtable), hline.after=c(-1,1,nrow(outtable)),include.colnames=FALSE)

我仍然希望自动化函数本身,因此我可以理想地给它一个变量名列表,它将在每个变量上运行函数,并在最终矩阵中填充结果。但是,一个婴儿一步一步......