将行标签打印为 table 的长 R 数据帧的方法
Method to print long R dataframes with row labels as table
假设我有一些非常长的带有行标签的信息数据框。
如果我尝试使用 kable 或任何标准 table 打印对象,它不会打印整齐。我希望将数据重新格式化为 table,同时仍将行名保留为列行标签。举个例子,想象一下像下面这样长达 1000 行的字母数据框。如果我把它打印成 pdf table,它会占用大约十分之一的页面宽度,以及好几页。
> 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 之类的 tabular knitr 方法),它会突出显示与值列明显不同的标签。
例如
> 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"
考虑您的示例数据:
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
假设我有一些非常长的带有行标签的信息数据框。 如果我尝试使用 kable 或任何标准 table 打印对象,它不会打印整齐。我希望将数据重新格式化为 table,同时仍将行名保留为列行标签。举个例子,想象一下像下面这样长达 1000 行的字母数据框。如果我把它打印成 pdf table,它会占用大约十分之一的页面宽度,以及好几页。
> 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 之类的 tabular knitr 方法),它会突出显示与值列明显不同的标签。
例如
> 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"
考虑您的示例数据:
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