【问题标题】:xtable output for a list of tables表列表的 xtable 输出
【发布时间】:2011-09-14 23:22:17
【问题描述】:

我有一个表格列表,想将其用于 LaTex 输出。代码如下:

Data <- esoph[ , 1:3]
library(plyr)
combos <- combn(ncol(Data),2)

TabelFn <- function(x) {
  Table <- addmargins(table(Data[, x[1]], Data[, x[2]]))
  return(Table)
  }

Table <- alply(.data=combos, .margins=2, .fun=TabelFn, .expand=TRUE)
library(xtable)

在这种情况下,Table 列表有三个列联表,我可以使用以下代码将输出转换为 LaTex:

<< label = tabTable, echo = FALSE, results = tex >>=
print(xtable(Table[1]$'1', caption = "Contingency table for agegp and alcgp", label = "tab:Table[1]",
             digits = c(0, rep(0, ncol(Table[1]$'1'))),
             align = paste(paste("l|", paste(rep("r", ncol(Table[1]$'1')-1), collapse =     ''), sep = ""), "l", sep = "")),
      table.placement = "tbp", caption.placement = "top",
      hline.after = c(-1, 0, nrow(Table[1]$'1')))
@

要发送三个列联表的输出,我必须编写三个这样的命令。在这种情况下是可行的。但是对于我的实际数据,我有很多列联表。我想知道如何更有效地发送所有列联表。一种选择是只打印列表Table 而不打印xtable。但我希望列联表具有良好的输出格式。感谢您的时间和帮助。

【问题讨论】:

    标签: r sweave xtable


    【解决方案1】:

    我需要一些模拟数据来处理

    Data <- data.frame(a=rbinom(100,1,0.5), b=rbinom(100,1,0.3), c=rbinom(100,1,0.6))
    

    使用您的代码生成Table,这将使您接近

    l_ply(Table, function(TBL) {
      print(xtable(TBL, 
          caption = "Contingency table for agegp and alcgp", #This information is not in the TBL anywhere
          label = "tab:Table[1]", # This is also problematic
          digits = c(0, rep(0, ncol(TBL))),
        align = paste(paste("l|", paste(rep("r", ncol(TBL)-1), collapse = ''), sep = ""), "l", sep = "")),
        table.placement = "tbp",
        caption.placement = "top",
        hline.after = c(-1, 0, nrow(TBL)))  
    })
    

    您可以通过迭代 Table 而不是 Table 本身的索引来获得正确的标签

    a_ply(seq_along(Table), 1, function(i) {
      print(xtable(Table[[i]], 
          caption = "Contingency table for agegp and alcgp", #This information is not in the Table[[i]] anywhere
          label = paste("tab:Table[",i,"]",sep=""), 
          digits = c(0, rep(0, ncol(Table[[i]]))),
        align = paste(paste("l|", paste(rep("r", ncol(Table[[i]])-1), collapse = ''), sep = ""), "l", sep = "")),
        table.placement = "tbp",
        caption.placement = "top",
        hline.after = c(-1, 0, nrow(Table[[i]])))       
    })
    

    无法自动制作标题,因为信息不存在。但是,如果您修改 TableFn 函数,您可以添加该信息,然后将其提取出来。

    TabelFn <- function(x) {
      Table <- addmargins(table(Data[, x[1]], Data[, x[2]]))
      names(attr(Table,"dimnames")) <- names(Data)[x]
      return(Table)
    }
    
    Table <- alply(.data=combos, .margins=2, .fun=TabelFn, .expand=TRUE)
    
    a_ply(seq_along(Table), 1, function(i) {
      vars <- names(attr(Table[[i]],"dimnames"))
      print(xtable(Table[[i]], 
          caption = paste("Contingency table for", vars[1], "and", vars[2]),
          label = paste("tab:Table[",i,"]",sep=""), # This is also problematic
          digits = c(0, rep(0, ncol(Table[[i]]))),
        align = paste(paste("l|", paste(rep("r", ncol(Table[[i]])-1), collapse = ''), sep = ""), "l", sep = "")),
        table.placement = "tbp",
        caption.placement = "top",
        hline.after = c(-1, 0, nrow(Table[[i]])))       
    })
    

    【讨论】:

    • @Brian Diggs,非常感谢。你总是来救我的。再次感谢。
    • @Brian Diggs,如果你能帮助我以同样的方式获得频率,我将不胜感激。我使用了这个命令 Freq
    • 变量很少,效果很好。但是根据我的实际数据,我得到了 LaTeX Error: Too many unprocessed floats.
    • @MYaseen208:对于频率,我会做一些不同的事情。 Freq &lt;- llply(.data=Data, .fun=table)(这使用了 data.frame 是列列表并将列名拉入的事实)然后 xtable-ing 它通过迭代名称:l_ply(names(Freq), function(n) {print(xtable(Freq[[n]], caption=n))})(我已经遗漏了大部分空格的格式,但标题在那里)。
    • 对于太多未处理的浮点数,或许可以尝试将table.placement 更改为H 并将\usepackage{float} 添加到Sweave 文件的前导码中。我不知道它是否会起作用,但它可能会。
    【解决方案2】:

    鉴于缺乏实际数据及其结构,这是一种方法。

    TabelFn2 <- function(x) {
      Table <- addmargins(table(Data[, x[1]], Data[, x[2]]))
      print(xtable(Table$'1', caption = "Contingency table for agegp and alcgp", 
           label = "tab:Table", digits = c(0, rep(0, ncol(Table$'1'))),
           align = paste(paste("l|", paste(rep("r", ncol(Table$'1')-1), 
           collapse = ''), sep = ""), "l", sep = "")),
          table.placement = "tbp", caption.placement = "top",
          hline.after = c(-1, 0, nrow(Table$'1')))
     }
    
    <<echo = F, results = tex>>=
    a_ply(.data=combos, .margins=2, .fun=TabelFn2)
    @
    

    【讨论】:

    • @Ramnath 为您的回复。使用您给定的代码 Rnw 文件有效,但使用 LaTex 我收到此错误消息:LaTeX 错误:未处理的浮点数过多。即使我使用了 \usepackage[section] {placeins}。任何意见。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2014-03-18
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多