假设我有一些非常长的带有行标签的信息数据帧。 如果我尝试使用kable或任何标准表格打印对象,则打印不整齐。我希望将数据重新格式化为表格,同时仍将rownames保留为列行标签。举个例子,想象一下像下面的1000行一样的字母数据框。如果我将它打印为pdf表,它将占用页面宽度的十分之一和几页。
> eg <- data.frame(LETTERS,seq(26),seq(26))
LETTERS seq.26. seq.26..1
1 A 1 1
2 B 2 2
3 C 3 3
4 D 4 4
..................
24 X 24 24
25 Y 25 25
26 Z 26 26
我想要一些表格对象用knitr整齐打印,例如,
A 1 1 F 6 6 K 11 11 ...
B 2 2 G 7 7 L 12 12 ...
C 3 3 H 8 8 M 13 13 ...
D 4 4 I 9 9 N 14 14 ...
E 5 5 J 10 10 O 15 15 ... Z 26 26
我省略了一些数据以节省打字。但是,任何从原始数据帧获得此类表格输出的方法都是可取的。似乎应该有一个简单的任务,使用像将数据帧重新定义为矩阵的东西,但它会丢失行标签信息。我找不到任何例子。有什么想法吗?
edit1:假设我有一列行标签已经很好(如LETTERS示例中所示)。 edit2:我试图使用一个简单的矩阵重新标注数据,它确实接近我想要的,但行到列标签失去了他们的关系。另外需要指出的是,我仍然希望打印一个对象(通过kable,如表格式编织方法),可以从值列中突出显示标签。
e.g。
> matrix(as.matrix(eg),4,6)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "A" "E" "1" "5" "1" "5"
[2,] "B" "F" "2" "6" "2" "6"
[3,] "C" "G" "3" "7" "3" "7"
[4,] "D" "H" "4" "8" "4" "8"
答案 0 :(得分:2)
考虑您的样本数据:
eg<- data.frame(LETTERS[1:26],seq(26),seq(26), stringsAsFactors = FALSE)
您可以创建一个包含所需行数的子集的矩阵,然后cbind
将它们组合在一起:
outrows <- 4
output <- do.call(cbind,
sapply(1:((nrow(eg)/outrows)+1),
function(i) eg[seq(outrows*i-(outrows-1), outrows*i),]))
output[is.na(output)] <- "" #Making sure nasty NA's don't polute our output
您可能对没有引号的结果感兴趣,所以:
> print(output, quote = FALSE)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21]
[1,] A 1 1 E 5 5 I 9 9 M 13 13 Q 17 17 U 21 21 Y 25 25
[2,] B 2 2 F 6 6 J 10 10 N 14 14 R 18 18 V 22 22 Z 26 26
[3,] C 3 3 G 7 7 K 11 11 O 15 15 S 19 19 W 23 23
[4,] D 4 4 H 8 8 L 12 12 P 16 16 T 20 20 X 24 24
甚至(来自here):
> write.table(format(output, justify="right"), row.names=F, col.names=F, quote=F)
A 1 1 E 5 5 I 9 9 M 13 13 Q 17 17 U 21 21 Y 25 25
B 2 2 F 6 6 J 10 10 N 14 14 R 18 18 V 22 22 Z 26 26
C 3 3 G 7 7 K 11 11 O 15 15 S 19 19 W 23 23
D 4 4 H 8 8 L 12 12 P 16 16 T 20 20 X 24 24