2010-04-21 38 views
16

我有一個數據框,我將其放入使用xtable的sweave文檔中,但是其中一個列名非常長,我想將其分解兩條線路,以節省空間如何將新行放入xtable中的列標題中R

calqc_table<-structure(list(RUNID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), ANALYTEINDEX = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), ID = structure(1:11, .Label = c("Cal A", "Cal B", "Cal C", 
"Cal D", "Cal E", "Cal F", "Cal G", "Cal H", "Cal High", "Cal Low", 
"Cal Mid"), class = "factor"), mean_conc = c(200.619459644855, 
158.264703128903, 102.469121407733, 50.3551544728544, 9.88296440865076, 
4.41727762501703, 2.53494715706024, 1.00602831741361, 199.065054555735, 
2.48063347296935, 50.1499780776199), sd_conc = c(2.3275711264554, 
NA, NA, NA, NA, NA, NA, 0.101636943231162, 0, 0, 0), nrow = c(3, 
1, 1, 1, 1, 1, 1, 3, 2, 2, 2)), .Names = c("Identifier of the Run within the Study", "ANALYTEINDEX", 
"ID", "mean_conc", "sd_conc", "nrow"), row.names = c(NA, -11L 
), class = "data.frame") 
calqc_xtable<-xtable(calqc_table) 

我試圖把一個新行到名字,但是這似乎並沒有工作

names(calqc_table)[1]<-"Identifier of the \nRun within the Study" 

有沒有辦法做到這一點?我看到有人建議使用hmisc包中的乳膠功能來手動迭代表格並手動將它寫入乳膠,包括換行符,但這看起來像是一個faf!

+0

這是一個完全有效的問題,適用於很多情況,但在這種特定情況下,我可能會探索減少詞義的方法 - 可能是「運行標識符」而不是「運行標識符在研究中「? – Sharpie 2010-04-21 23:04:50

+0

你是對的,我想出了一個簡短的例子,而我的長頭銜比我平常更羅嗦...... – PaulHurleyuk 2010-04-23 19:59:36

回答

24

我發現要做到這一點的最佳方式是將表格列指定爲「固定寬度」列,以便其中的文本包裝。您提供的選項「rownames」列 - 這是最初l規範的校準

align(calqc_xtable) <- c('l', 'p{1.5in}', rep('c',5)) 

xtable需求:隨着xtable包,這是可以做到的。章節規範p{1.5in}用於您的第一列標題,該標題非常長。這將它限制在一個寬度爲1.5英寸的盒子中,如果需要,標題將包裝到多行上。其餘五列使用c說明符集中居中。

固定寬度列如p{1.5in}的一個主要問題是他們使用對齊對齊設置文本。這會導致每行中的字間間距被擴大,使得該行將填滿分配的整個1.5英寸。

坦率地說,在大多數情況下,這產生了我無法用禮貌語言描述的結果(我是一個業餘印刷術堅果,並且這種行爲導致面部蜱)。

解決方法是通過在前面加上一個>{}字段到列規範提供一種膠乳對準命令:

align(calqc_xtable) <- c('l', '>{\\centering}p{1.5in}', rep('c',4)) 

其它有用的對準命令是:

  • \ raggedright - >導致文本是左對齊
  • \ raggedleft - >導致文本爲右對齊

記得在R字符串中加上反斜槓以避免它們。您可能還需要禁用xtable默認使用的字符串衛生功能。

注意

這對準如果除非表中的行與\tabularnewline代替\\,我想結束一個表格的最後一欄使用的技術會失敗不符合xtable和案件不容易通過任何用戶可設置的選項進行定製。

要考慮的另一件事是,你可能不希望整個列線纏繞到1.5英寸和居中只是頭。在這種情況下,禁用xtable串消毒,並使用寬度爲1的\multicolumn小區設置你的頭:

names(calqc_table)[1]<-"\\multicolumn{1}{>{\\centering}p{1.5in}}{Identifier of the Run within the Study}" 
+0

有沒有一種方法來指定列的最大寬度?像p {<= 1.5in}之類的東西? – dariaa 2015-08-13 21:03:07

+0

這可能是你必須要做的,但它是可惡的。 – dfrankow 2015-08-23 20:06:57

2

@Sharpie的技術並沒有爲我工作,因爲pandoc錯誤43轉換失敗爲PDF。因此,這裏是我做過什麼:

移動\\centering標記:

names(calqc_table)=c(rep("\\multicolumn{1}{p{0.75in}}{\\centering Identifier of the Run within the Study}", 6)) 

(這裏應用於表中的所有6列)

和xtable印刷禁用消毒:

print(calqc_table, sanitize.colnames.function=function(x){x})