2014-07-04 68 views
2

如何獲得xtable(儘管我也有pander.table這個問題),希望將字母分配給打印函數中的數據框的列,而無需呈現表格然後手動輸入希臘字母的乳膠?動態希臘字母作爲RMarkdown表中的變量名稱

這裏的數據重複的例子:

#data in 
chiSq <- 1600 
df <- 850 
p <- 0.95 
CFI <- 0.95 
TLI <- 0.95 
RMSEA <- 0.04 
LOWRMSEA <- 0.03 
HIGHRMSEA <- 0.04 

我通常有看起來像這樣的一些數據幀。

fit.stat <- data.frame(chiSq, df, p, CFI, TLI, RMSEA, LOWRMSEA, HIGHRMSEA) 

下面是當我去使數據幀的表xtable我經常遇到的一些具體問題:

  • 我想什麼做的是CHISQ更改爲符號卡方。在乳膠這$x^2$將呈現相應的符號。
  • 我還需要p用斜體表示。
  • 最後,LOWRMSEA和HIGHRMSEA是上限和下限,我希望他們刪除列名並將數據包括在RMSEA列中,與您置信區間的方式相同。

我發現做到這一點的唯一方法是使用下面的命令

library(xtable) 
print(xtable(fit.stat, caption = "Model Fit Information for CFA"), 
caption.placement="top", 
type = "latex") 

將會產生這種先打印的表格:

\begin{table}[ht] 
\centering 
\caption{Model Fit Information for CFA} 
\begin{tabular}{rrrrrrrrr} 
    \hline 
& chiSq & df & p & CFI & TLI & RMSEA & LOWRMSEA & HIGHRMSEA \\ 
    \hline 
1 & 1600.00 & 850.00 & 0.95 & 0.95 & 0.95 & 0.04 & 0.03 & 0.04 \\ 
    \hline 
\end{tabular} 
\end{table} 

然而,然後我需要手動編輯該表創建此:

\begin{table}[ht] 
\centering 
\caption{Model Fit Information for CFA} 
\begin{tabular}{rrrrrrrrrrrr} 
    \hline 
& $x^2$ & {\it df} & {\it p} & CFI & TLI & RMSEA\\ 
    \hline 
&1600.00 & 850.00 & 0.00 & 0.95 & 0.95 & 0.04 (0.03 - 0.04) \\ 
    \hline 
\end{tabular} 
\end{table} 

我想能夠動態地執行此操作而無需手動編輯表格,以便我可以將其作爲代碼塊包含在markdown文檔中。 謝謝。

+0

你能解釋更好嗎?我在表 – rawr

+1

中使用希臘字母沒有問題所以你的問題是「你應該手動編輯嗎?」如果是這樣,那就是SO的主題。如果你想幫助編寫代碼,以便你不必做這些編輯,你應該做一個[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great- r-reproducible-example)來說明問題並闡明所需的輸出。 – MrFlick

回答

0

就合併RMSRESEA & HIGHRMSEA值而言,這可能是數據框架中最好的粘貼方法。例如

fit.stat <- data.frame(chiSq, df, p, CFI, TLI, 
    RMSEA = paste0(RMSEA , " (",LOWRMSEA," - ", HIGHRMSEA,")")) 

那麼對於列名,您可以通過自定義功能sanitize覆蓋的print.xtable的消毒功能。我相信你已經知道了,通常所有「特殊」LaTeX角色都被剝離或逃脫,以免干擾佈局。但是,在這裏我們可以創建一個函數來替代我們。首先,我們定義一個函數

formatcolheads<-function(x) { 
    sanitize<-get("sanitize", parent.frame()) 
    x<-sanitize(x) 
    x<-gsub("chiSq","$x^2$",x) 
    x<-gsub("df","{\\\\it df}",x) 
    x<-gsub("p","{\\\\it p}",x) 
    x 
} 

注意,我做了一些工作,搶默認sanitize功能,並運行在列只是爲了確保不會有任何問題。然後我會去替換你想改變的值。請注意,我們必須爲「它的東西」加倍換碼。但是,我們使用的功能這樣

print(xtable(fit.stat, caption = "Model Fit Information for CFA"), 
caption.placement="top", sanitize.colnames.function = formatcolheads, 
type = "latex") 

和產生

\begin{table}[ht] 
\centering 
\caption{Model Fit Information for CFA} 
\begin{tabular}{rrrrrrl} 
    \hline 
& $x^2$ & {\it df} & {\it p} & CFI & TLI & RMSEA \\ 
    \hline 
1 & 1600.00 & 850.00 & 0.95 & 0.95 & 0.95 & 0.04 (0.03 - 0.04) \\ 
    \hline 
\end{tabular} 
\end{table} 

這似乎是你所期望的輸出。

+0

+1。 @MrFlick:我想投票,但我需要等待,直到我在這裏足夠長的時間才能啓用此權限。這是一個很好的解決方案,也應該與pander.table一起工作。 'sanitize'功能讓您的工作流程得到了很大改善。 – bfoste01

+0

請注意,在您發佈的解決方案中,x'-gsub(「chiSq」,「$ x^2」,x)'需要是'x <-gsub(「chiSq」,「$ x^2 $」,x )'。這是一個很小的編輯,因此不會讓我爲你修復它。再次感謝。 – bfoste01

+0

@ bfoste01好的。我修好了它。 – MrFlick