【问题标题】:Suppressing column names within a matrix and looping function抑制矩阵中的列名和循环函数
【发布时间】:2013-10-01 18:00:21
【问题描述】:

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

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

group1mean、group1sd、group2mean、group2sd、t 值、p 值。

目前,我的功能是这样做的。但是,它会生成我想留空的列名(例如 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”(将它们留空)并使代码在变量列表上自动运行。这些事情中的任何一个都可能吗?感谢您的宝贵时间。

【问题讨论】:

  • 您好,为什么您需要“空白”列名?这会让你做哪些你不能用列名做的事情?
  • 我基本上有两行列名 - 一行用于“大学”和“非大学”组,另一行用于统计数据,M1、SD1、M2、SD2、t、p。正如它现在工作的那样,当您使用 xtable 时,它​​会在 t 上方打印“V3”,在 p 上方打印“V4”。这是最终报告的非必要信息。所以这是一个审美问题。
  • 问题是打印输出格式问题之一还是数据管理问题之一?如果是后者,听起来像使用lists 中的list 是你最好的选择
  • 是前者。数据都在我想要的地方。我只需要正确格式化顶层以通过 xtable 打印。
  • 这就像用锤子敲钉子一样。

标签: r function xtable psych


【解决方案1】:

尝试保留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

【讨论】:

  • 我明白你在这里想要做什么,我明白你为什么要这样做。但是,它不适用于我的特定目的。因为我有统计数据和组名,所以我希望它们都在表中。所以我需要最上面一行是组标签“大学毕业生”和“不到大学毕业生”。然后紧接着我需要另一行,其中包含每个统计量 M (SD)、M (SD)、t、p 的标签。您的解决方案只处理第二组。
  • 这听起来不像是数据处理问题,而是输出/打印问题。如果是这样,我强烈建议使用其他方式,包括 cat print
  • 我认为你可能是对的。我认为我需要通过 print 函数实际抑制列名,并实际上在矩阵的前两行中包含我想要的所有标签。谢谢你的帮助。
【解决方案2】:

我通过将我真正想要的所有标签放在矩阵的前两行中的最终表格中来解决了额外的列标签打印问题...

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))

然后使用打印功能(如 Ricardo 建议的那样)抑制列名...

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

我仍然想自动化函数本身,所以我可以理想地给它一个变量名称列表,它将在每个变量上运行函数,并将结果填充到最终矩阵中。但是一次又一次地迈出一小步……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2021-12-12
    • 2019-03-02
    相关资源
    最近更新 更多