2010-04-21 59 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})