使用多行列名打印R数据框

时间:2013-02-18 19:43:45

标签: r dataframe

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

我知道我可以缩短名字,但不愿意。

3 个答案:

答案 0 :(得分: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 $$表的选项,可能有一个选项)。

答案 1 :(得分: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

答案 2 :(得分: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

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