使用行标签作为表打印长R数据帧的方法

时间:2015-06-24 02:29:32

标签: r printing knitr

假设我有一些非常长的带有行标签的信息数据帧。 如果我尝试使用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" 

1 个答案:

答案 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