2012-01-13 19 views
0

我無法找到一種非常直觀的方式來做最基本的事情;用我的基本變量創建一個彙總表。我發現目前使用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()方法上,只是針對單個變量或同一類型的變量。

我的問題:是否有一個包/功能,允許一個簡單的方法來創建一個漂亮的乳膠表?如果是這樣,請給出一個如何得到上述結果的提示。

謝謝!

+0

哪些問題是你的問題?關於創建一個關於變量的摘要信息的表的標題,或者最後一個關於製作一個漂亮的乳膠表的標題? – Seth 2012-01-13 22:33:04

+0

對不起,我最感興趣的只是獲取細胞。格式化LaTeX可能不是真正的R問題 – 2012-01-14 10:08:18

+0

請參閱R'Hmisc'軟件包'summaryM'函數。 – 2016-05-07 17:50:12

回答

2

如果你重寫你的功能,所以它總是返回一個字符串 (它有時會返回一個字符串,有時一個號碼,有時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="") 
+0

謝謝你的回答,這適合我的需求最好,我也喜歡答案,因爲我已經完全忘記了美麗的sprintf()函數(或相反,我不認爲它存在於R)。 Sparkline直方圖非常好,也許我會嘗試以某種方式將它們添加到我的表中。我不知道這些雜誌是否接受這種高級表格。 – 2012-01-15 12:09:43

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

2

看看tables包的另一種方法,可能會使這更簡單。

+0

看起來真的很有趣,那裏有一個包的教程嗎? – 2012-01-14 11:05:58

1

如果你想創建一個兼有變量和連續變量的彙總表,你應該查看包'tableone'。

下面是它可以做的一個例子https://rpubs.com/kaz_yos/tableone-vignette。這裏是pdf文檔:https://cran.r-project.org/web/packages/tableone/tableone.pdf

我希望這有助於。

  • 邁克
+0

tableone包很有趣,但自從我寫了這個問題以來,我已經編寫了一個處理這個問題的包,Gmisc - 參見[vignette](https://cran.r-project.org/web/packages/Gmisc/vignettes/ Descriptives.html) – 2016-01-25 20:21:12

+0

好的非常感謝你的答覆。我是新來stackoverlow和欣賞反饋。 – Mike 2016-01-25 20:48:09

相關問題