摘要表(使用表或xtable包),计数为3级深度

时间:2017-06-27 12:43:50

标签: r tabular xtable

我正在使用tabular包中的tables函数来获取“df”数据帧的摘要表。我需要获得一个可以处理的输出,以获得具有多个单元格功能的Latex表。

下面是虚拟“df”数据帧:

age <- c(62, 60, 63, 59, 63, 67, 71, 64, 65, 66, 68, 66, 71, 67, 68, 68, 56, 62, 60, 61, 63, 64, 63, 59)
L3 <- factor(rep(paste(LETTERS[7:16], LETTERS[7:16], LETTERS[7:16], sep=""), c(1,3,2,1,3,5,1,1,6,1)))
L2 <- factor(rep(paste(LETTERS[3:6], LETTERS[3:6], sep=""), c(4,6,6,8)))
L1 <- factor(rep(LETTERS[1:2], c(10,14)))
df <- data.frame(Top=L1, Mid=L2, Low=L3, Age=age, stringsAsFactors=F)

我使用以下R命令行来生成摘要表:

tabular( (Top*Mid*Low*DropEmpty()) ~ (CL3=1) + (Age)*(Format(digits=2, latex=T)*mean + Format(digits=3, latex=T)*sd), data=df)

使用此命令行生成的摘要表如下:

                 Age      
 Top Mid Low CL3 mean sd  
 A   CC  GGG 1   62     NA
         HHH 3   61   2.08
     DD  III 2   65   2.83
         JJJ 1   71     NA
         KKK 3   65   1.00
 B   EE  LLL 5   68   1.87
         MMM 1   68     NA
     FF  NNN 1   56     NA
         OOO 6   62   1.47
         PPP 1   59     NA

标题:CL3是一个简短的名字,意思是“在3级计数”(即:中上半部组合)。

但我想得到这个(2个额外的计数列(CL1和CL2)分别在“Top”和“Mid”级别):

                 Age      
 Top CL1 Mid CL2 Low CL3 mean sd  
 A   10  CC  4   GGG 1   62     NA
                 HHH 3   61   2.08
         DD  6   III 2   65   2.83
                 JJJ 1   71     NA
                 KKK 3   65   1.00
 B   14  EE  6   LLL 5   68   1.87
                 MMM 1   68     NA
         FF  8   NNN 1   56     NA
                 OOO 6   62   1.47
                 PPP 1   59     NA

标题:CL1,CL2,CL3只是短名称,意思是“在x级计数”(x代表Top,Top-Mid,Top-Mid-Low组合)。

那么,你能帮我弄清楚如何使用tabular包的tables函数来解决这个问题吗?我需要使用此函数,或至少任何其他可以输出Latex代码处理多单元格功能的函数(例如:xtablebytable taRifx包),因为我想输出该表的图片(.EMF或.SVG或.JPG),以verticaly为中心的多行单元格。

2 个答案:

答案 0 :(得分:1)

表格似乎不支持嵌套公式 - 即尝试执行((Top~(CL1=1))*(Mid~(CL2=1))*Low*DropEmpty())会引发有关嵌套公式的错误。因此,一个想法可能是在使用tabular

之前获取组计数

类似的东西:

df$CL1 <- factor(ave(as.character(df$Top), as.character(df$Top), FUN = length))
df$CL2 <- factor(ave(as.character(df$Mid), as.character(df$Mid), FUN = length))

tabular( (Top*CL1*Mid*CL2*Low*DropEmpty()) ~ (CL3=1) + (Age)*(Format(digits=2, latex=T)*mean + Format(digits=3, latex=T)*sd), data=df)

 #Top CL1 Mid CL2 Low CL3 mean sd  
 #A   10  CC  4   GGG 1   62     NA
 #                HHH 3   61   2.08
 #        DD  6   III 2   65   2.83
 #                JJJ 1   71     NA
 #                KKK 3   65   1.00
 #B   14  EE  6   LLL 5   68   1.87
 #                MMM 1   68     NA
 #        FF  8   NNN 1   56     NA
 #                OOO 6   62   1.47
 #                PPP 1   59     NA

答案 1 :(得分:1)

以下是使用dplyr和(我的)huxtable包的内容:

library(huxtable)
library(dplyr)

# prepare summaries:
df_sum <- df %>% 
      group_by(Top) %>% mutate(CL1 = n()) %>% 
      group_by(Mid, add = TRUE) %>% mutate(CL2 = n()) %>% 
      group_by(Low, add = TRUE) %>% mutate(CL3 = n()) %>% 
      summarize(
        mean = mean(Age), 
        sd   = sd(Age), 
        CL1  = CL1[1], 
        CL2  = CL2[1], 
        CL3  = CL3[1]
      ) %>% 
      select(Top, CL1, Mid, CL2, Low, CL3, mean, sd)

# format for LaTeX/HTML output:
hux_sum <- as_hux(df_sum)
rowspan(hux_sum)[c(1,6), 1:2] <- 5
rowspan(hux_sum)[c(1,3,6,8), 3:4] <- c(2,3,2,3)
number_format(hux_sum)[, 1:6] <- 0
hux_sum