我有一个带有长列名的 R 数据框。所以当我打印数据框时它太宽了。有没有一种简单的方法可以将数据框打印到屏幕上,并且列名出现在多行中?
我知道我可以缩短名称,但不想这样做。
您可以创建一个自定义format.data.frame
函数,并在 R 找到“长”名称时修改行为:
long <- nchar(cn, "bytes") > 256L
cn[long] <- paste(substr(cn[long], 1L, 250L), "...")
names(rval) <- cn
并且由于在所有预处理之后数据帧被打印为矩阵,我们希望print.default
(实际上,通用print.default
)像 cat 一样处理转义字符(按原样打印,以便在打印时获得一个新行\n
)。
编辑
实际上,print.default
转义不可打印的字符(猫在线帮助页面)
字符串按“原样”输出(与 print.default 转义不可打印字符和反斜杠 [...] 不同)
所以你应该开始准备你自己的方法(另外,检查将 R 对象转换为 $$\LaTeX$$ 表的选项,可能有一个选项)。
当奥斯卡的答案被接受时,我认为这实际上可能是一个答案。不幸的是,它只是复制代码format.daa.frame
并说“在这里做一些未指定的魔法”。这是一些实际上做某事的代码,尽管当时我认为它太粗糙而无法发布。它仍然打印矩阵行和列标题。我不知道如何压制它。也许需要一种黑客攻击的矩阵打印方法?
dfrm <- data.frame(reallly_long.nameeeeeeeeeeeeeeeeeeeeeeee=letters[1:5],
secondreallly_long.nameeeeeeeeeeeeeeeeeeeeeeee=letters[1:5], short=2)
pdfrm <- function(dfrm) { # first print the names broken into sections
print( unname(t(sapply( 1:(max(nchar(names(dfrm))) %/% 12),
# first construct break points to be passed to `substr`
function(rr) sapply(names(dfrm),
substr, 1+(rr-1)*10, 9+(rr-1)*10) ) )) ,quote=FALSE,
# then print with sufficient gap
print.gap=8)
# Now print a headerless data.frame with wider spacing
print( setNames(dfrm, rep(" ", length(dfrm))), print.gap = 15 )}
pdfrm(dfrm)
#------------------------------
[,1] [,2] [,3]
[1,] reallly_l secondrea short
[2,] ng.nameee lly_long.
[3,] eeeeeeeee ameeeeeee
1 a a 2
2 b b 2
3 c c 2
4 d d 2
5 e e 2
删除矩阵行和列
我以某种方式编辑了上面42-print
的代码,以通过创建函数的修改来解决删除矩阵行和列索引的问题。这是代码:
pdfrm <- function(dfrm) { # first print the names broken into sections
mprint <- function(Mn){
rownames(Mn) <- rep("",nrow(Mn))
colnames(Mn) <- rep("",ncol(M))
print(as.table(Mn),quote=FALSE,print.gap=8)
}
mprint(unname(
t(sapply( 1:(max(nchar(names(dfrm))) %/% 12),
# first construct break points to be passed to `substr`
function(rr) sapply(names(dfrm), substr, 1+(rr-1)*10, 9+(rr-1)*10) ) )))
# Now print a headerless data.frame with wider spacing
print( setNames(dfrm, rep(" ", length(dfrm))), print.gap = 15 )
}
pdfrm(dfrm)
它输出以下内容:
reallly_l secondrea short
ng.nameee lly_long.
eeeeeeeee ameeeeeee
1 a a 2
2 b b 2
3 c c 2
4 d d 2
5 e e 2
可以修改上面的代码,以便它可以处理任意和自适应间距。