【问题标题】:Abbreviate column names during data frame print在数据框打印期间缩写列名
【发布时间】:2015-01-20 22:51:37
【问题描述】:

R 的 abbreviate() 可用于将数据帧的列名截断为设定长度,并通过良好的检查确保唯一性等:

abbreviate(names(dframe), minlength=2)

当然,我们可以使用这个函数在原地缩写列名,然后打印出更改后的数据框

>>names(dframe) <- abbreviate(names(dframe), minlength=2)
>>dframe

但我想打印出带有缩写列名的数据框而不在此过程中更改数据框。希望这可以通过 print() 调用中的简单格式选项来完成,尽管我通过打印和格式方法(如 print.data.frame)的帮助页面进行搜索并没有找到任何明显的解决方案(可用选项似乎更多用于格式化列值,而不是它们的名称)。

那么,print() 或 format() 是否有任何选项可以在列名上调用 abbreviate()?如果没有,有没有办法在将它传递给 print() 之前将 abbreviate() 应用于数据帧的列名,而不改变传递的数据帧?

我想得越多,我就越认为唯一的方法是向 print() 传递一个带有已经缩写的列名的数据框的副本。但这对我来说不是解决方案,因为我不想在交互式会话期间更新原始副本时不断更新此副本。原始列名必须保持不变,因为我使用 which(colnames(dframe)=="name_of_column") 与数据交互。

我的最终目标是在使用 Server Auditor 等 ssh 应用程序时,在移动设备的小屏幕上更好地远程工作。如果列名仅缩写为 2-3 个字符,我仍然可以识别它们,但可以在屏幕上容纳更多数据。或许还有更适合压缩打印的 R 包?

【问题讨论】:

    标签: r mobile printing


    【解决方案1】:

    您可以定义自己的打印方法

    print.myDF <- function(x, abbr = TRUE, minlength = 2, ...) {
        if (abbr) {
            names(x) <- abbreviate(names(x), minlength = minlength) 
        }
        print.data.frame(x, ...)
    }
    

    然后将myDF类添加到数据中并打印

    class(iris) <- c("myDF", class(iris))
    head(iris, 3)
    #   S.L S.W P.L P.W     Sp
    # 1 5.1 3.5 1.4 0.2 setosa
    # 2 4.9 3.0 1.4 0.2 setosa
    # 3 4.7 3.2 1.3 0.2 setosa
    print(head(iris, 3), abbr = FALSE)
    #   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    # 1          5.1         3.5          1.4         0.2  setosa
    # 2          4.9         3.0          1.4         0.2  setosa
    # 3          4.7         3.2          1.3         0.2  setosa
    print(head(iris, 3), minlength = 5)
    #   Spl.L Spl.W Ptl.L Ptl.W  Specs
    # 1   5.1   3.5   1.4   0.2 setosa
    # 2   4.9   3.0   1.4   0.2 setosa
    # 3   4.7   3.2   1.3   0.2 setosa
    

    【讨论】:

    • 是的,只是窃取 BondedDust 的答案 :-) 好的,srsly,添加 classabbr 的默认参数做得很好。
    • 开枪! Duh 函数已经可以处理副本,因此可以避免更改原件。我也发现定义class 是一个非常干净的解决方案。这将成为这个菜鸟未来编程实践的一部分:)
    【解决方案2】:

    只需重写print.data.frame

     print.data.frame <-
                   function(x) setNames( print(x), 
                                    abbreviate(names(dframe), minlength=2) )
    

    (您可能需要一个辅助的 printfull.data.frame,首先将 print.data.frame 复制到其中。)

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2021-05-06
      • 2017-12-31
      • 2013-03-30
      • 2022-10-22
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多