Описательные таблицы - как создать таблицу, содержащую как числовые, так и категориальные переменные - PullRequest
1 голос
/ 14 января 2012

Я не могу найти действительно интуитивный способ сделать самую основную вещь;создание сводной таблицы с моими базовыми переменными.Лучший метод, который я нашел, в настоящее время использует 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 содержит:

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

Теперь это работает, но кажется очень сложным и не самым элегантным решением.Я пытался найти способы создания описательных таблиц, но все они сосредоточены на table (), prop.table (), summary () только для одной переменной или переменных того же вида.

Мой вопрос: Есть ли пакет / функция, которая позволяет легко создать красивый латексный стол?Если да, пожалуйста, дайте подсказку, как получить вышеуказанный результат.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 25 января 2016

Если вы хотите создать сводную таблицу как с категориальными, так и с непрерывными переменными, вы должны взглянуть на пакет tableone.

Вот пример того, что он может сделать https://rpubs.com/kaz_yos/tableone-vignette. ИВот документация в формате PDF: https://cran.r -project.org / web / packages / tableone / tableone.pdf

Надеюсь, это поможет.

  • Майк
2 голосов
/ 14 января 2012

Если вы переписываете свою функцию так, чтобы она всегда возвращала строку (иногда она возвращает строку, иногда число, иногда NULL), вы можете вызвать ddply для data.frame, не указывая все столбцы.

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="")
2 голосов
/ 14 января 2012

Посмотрите на пакет tables, чтобы сделать это проще.

2 голосов
/ 14 января 2012

То, что вы спрашиваете, является немного открытым, так как есть определенная вероятность того, что вы не согласитесь со мной по поводу того, что составляет «красивый 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...