【问题标题】:Descriptive tables - how to create a table containing both numeric and categorical variables描述性表 - 如何创建包含数字和分类变量的表
【发布时间】:2012-01-13 22:09:11
【问题描述】:

我找不到一种真正直观的方法来做最基本的事情;用我的基本变量创建一个汇总表。我发现的最好的方法是目前使用tapply:

seed(200)
my_stats <- function(x){
    if (is.factor(x)){
        a <- table(x, useNA="no")
        b <- round(a*100/sum(a),2)

        # If binary
        if (length(a) == 2){
            ret <- paste(a[1], " (", b[1], " %)", sep="")
        }
        return(ret)
    }else{
        ret <- mean(x, na.rm=T)
        if (ret < 1){
            ret <- round(ret, 2)
        }else{
            ret <- round(ret)
        }
        return(ret)
    }
}

library(rms)
groups <- factor(sample(c("Group A","Group B"), size=51, replace=T))
a <- 3:53 
b <- rnorm(51)
c <- factor(sample(c("male","female"), size=51, replace=T))

res <- rbind(a=tapply(a, groups, my_stats),
      b=tapply(b, groups, my_stats),
      c=tapply(c, groups, my_stats))
latex(latexTranslate(res))

资源包含:

> res
  Group A     Group B       
a "28"        "28"          
b "-0.08"     "-0.21"       
c "14 (56 %)" "14 (53.85 %)"

现在这可行,但它似乎非常复杂并且不是最优雅的解决方案。我试图搜索如何创建描述性表,但所有的焦点都集中在 table()、prop.table()、summary() 上,仅用于单个变量或同类变量。

我的问题:是否有一个包/功能可以轻松创建美观的乳胶表?如果是这样,请提示如何获得上述结果。

谢谢!

【问题讨论】:

  • 您的问题是什么?标题中的那个是关于创建一个包含变量摘要信息的表格,还是最后一个是关于制作一个漂亮的乳胶表格?
  • 对不起,我最感兴趣的只是获取细胞。格式化 LaTeX 可能不是真正的 R 问题
  • 查看 R HmiscsummaryM 函数。
  • @FrankHarrell:谢谢,因为我写了这个问题,所以我开发了我自己的生成表 1 的方法,你可以在我的 Gmisc 包中找到它,参见 vignette 示例

标签: r


【解决方案1】:

如果你重写你的函数,让它总是返回一个字符串 (它有时返回一个字符串,有时返回一个数字,有时返回 NULL), 您可以在 data.frame 上调用 ddply,而无需指定所有列。

f <- function(u) {
  res <- "?" 
  if(is.factor(u) || is.character(u)) {
    u <- table(u, useNA = "no")
    if (length(u) == 0 || sum(u) == 0) { res <- "NA" }
    else { res <- sprintf( "%0.0f%%", 100 * u[1] / sum(u) ) }
  } else {
    u <- mean(u, na.rm=TRUE)
    if(is.na(u)) { res <- "NA" }
    else { res <- sprintf( ifelse( abs(u) < 1, "%0.2f", "%0.0f" ), u ) }
  }
  return( res )
}
# Same function, for data.frames
g <- function(d) do.call( data.frame, lapply(d, f) )

library(plyr)
ddply(data.frame(a,b,c), .(groups), g)

由于您需要 LaTeX 表,您可能还想尝试以下方法,它不会对数据进行分组,但会为数值变量添加迷你图直方图。

library(Hmisc)
latex(describe(d), file="")

【讨论】:

  • 谢谢你的回答,这最适合我的需要,我也喜欢这个答案,因为我完全忘记了漂亮的 sprintf() 函数(或者更确切地说,我认为它不存在在 R)。迷你图直方图非常好,也许我会尝试以某种方式将它们添加到我的表格中。我不知道期刊是否接受这种高级表。
【解决方案2】:

您的问题有点开放式,因为您很可能会不同意我对“好看的 LaTeX 表”的构成。

例如,我可能更喜欢按行而不是按列来组织:

require(plyr)
require(xtable)
dat <- data.frame(a,b,c,groups)
xtable(ddply(dat,.(groups),summarise,a = my_stats(a),
                                     b = my_stats(b),
                                     c = my_stats(c)))


\begin{table}[ht]
\begin{center}
\begin{tabular}{rlrrl}
  \hline
 & groups & a & b & c \\ 
  \hline
1 & Group A & 28.00 & 0.14 & 13 (52 \%) \\ 
  2 & Group B & 28.00 & -0.00 & 13 (50 \%) \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

当然,如果您查看 ?xtable?print.xtable,其中大部分是可自定义的。

【讨论】:

    【解决方案3】:

    查看tables 包,了解另一种可能使这更简单的方法。

    【讨论】:

    • 看起来很有趣,有教程吗?
    【解决方案4】:

    如果您想创建一个包含分类变量和连续变量的汇总表,您应该查看“tableone”包。

    这是一个例子,它可以做什么https://rpubs.com/kaz_yos/tableone-vignette。这是 pdf 文档:https://cran.r-project.org/web/packages/tableone/tableone.pdf

    我希望这会有所帮助。

    • 迈克

    【讨论】:

    • tableone 包很有趣,但自从我写了这个问题后,我写了一个包来处理这个问题,Gmisc - 请参阅vignette
    • 好的,非常感谢您的回复。我是 stackoverlow 的新手,感谢您的反馈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 2021-06-11
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多