8

我有一个带有长列名的 R 数据框。所以当我打印数据框时它太宽了。有没有一种简单的方法可以将数据框打印到屏幕上,并且列名出现在多行中?

我知道我可以缩短名称,但不想这样做。

4

3 回答 3

2

您可以创建一个自定义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$$ 表的选项,可能有一个选项)。

于 2013-02-20T07:49:37.043 回答
2

当奥斯卡的答案被接受时,我认为这实际上可能是一个答案。不幸的是,它只是复制代码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
于 2013-02-20T17:27:05.037 回答
1

删除矩阵行和列

我以某种方式编辑了上面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

可以修改上面的代码,以便它可以处理任意和自适应间距。

于 2017-10-15T08:03:09.220 回答