【问题标题】:Printing R data frame with column names in multiple lines在多行中打印具有列名的 R 数据框
【发布时间】:2017-10-15 16:03:09
【问题描述】:

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

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

【问题讨论】:

  • 我认为没有办法做到这一点。我可能会后悔写这篇文章(因为在 R 中一切似乎都是可能的)。
  • 这当然是可能的,但有多种默认设置会造成严重障碍。我需要看到一个引人注目的用例(或一个非常大的赏金)来继续我已经浪费、呃、花费的搜索和初步工作。
  • 缩短列名。
  • @NathanG 的评论很幽默,但确实是正确答案。打印“到屏幕”不是您想要进入精美格式的地方。如果您想要视觉上吸引人的结果,请对write.table(your_dataframe,..) 创建的文件使用页面布局软件工具。
  • 你可以做些什么来让 Nathan G 评论有用确实是缩短列名并使用 newColumnName - realColumnName 维护一个命名列表(哈希),这样你就可以获得 realName 做hash["shortName"]跨度>

标签: r dataframe


【解决方案1】:

当奥斯卡的答案被接受时,我认为它可能实际上是一个答案。不幸的是,它只是从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】:

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

    【讨论】:

    • 我在上面评论过使列名更短。我是认真的。将列名缩写为合理的 6-8 个字符,并在旁边有一个键来解释它是什么。这样您就可以更轻松地操作数据,并且如果有必要,您可以在准备发布时将列名改回来。
    • 我完全同意 :) 我只是想取笑因诺(并表明任务的潜在难度,如果他冒险去做的话)。
    • 好的。 +1 表示努力,但 Inno 在问题中没有提及 LaTeX,并且重新配置 R 的默认值几乎总是一个坏主意。
    • 感谢大家的回答和 cmets。我怀疑这可能是一罐蠕虫,我会采取保持理智的方式并缩短我的列名。
    【解决方案3】:

    删除矩阵行和列

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 1970-01-01
      • 2021-12-13
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多