【问题标题】:Using a vector's print method in a data frame在数据框中使用向量的打印方法
【发布时间】:2015-01-27 02:51:42
【问题描述】:

考虑以下向量x

x <- c(6e+06, 75000400, 743450000, 340000, 4300000)

我希望以百万为单位打印x,所以我写了一个打印方法并将一个类分配给x

print.million <- function(x, ...) {
    x <- paste0(round(x / 1e6, 1), "M")
    NextMethod(x, quote = FALSE, ...)
}

class(x) <- "million"

所以现在x 将打印我想要的方式,数值也保持不变。

x
# [1] 6M     75M    743.5M 0.3M   4.3M  
unclass(x)
# [1]   6000000  75000400 743450000    340000   4300000

这是我想解决的问题。当我将x放入数据框时,打印方式不再适用,x的数值打印正常。

(df <- data.frame(x = I(x)))
#           x
# 1     6e+06
# 2  75000400
# 3 743450000
# 4    340000
# 5   4300000

x 列的类仍然是“百万”类,这绝对是我想要的。

df$x
# [1] 6M     75M    743.5M 0.3M   4.3M  
class(df$x)
# [1] "AsIs"    "million"

如何将x 放入数据框并保持其打印方法? 我已经尝试了data.frame() 的所有参数,但我真的不知道下一步该转向哪里。

所需的结果是下面的数据框,其中x 仍然是“百万”类,它维护其基础数值,并且还像在控制台中打印的矢量一样在数据框中打印。

#        x
# 1     6M
# 2    75M
# 3 743.5M
# 4   0.3M
# 5   4.3M

注意:此问题与an answer I posted earlier 的第二部分有关。

【问题讨论】:

    标签: r


    【解决方案1】:

    您需要一个format 方法和一个as.data.frame 方法,如下所示:

    x <- c(6e+06, 75000400, 743450000, 340000, 4300000)
    class(x) <- 'million'
    format.million <- function(x,...)paste0(round(unclass(x) / 1e6, 1), "M")
    as.data.frame.million <- base:::as.data.frame.factor
    data.frame(x)
    

    【讨论】:

    • 它仍然是一个数字向量。试试unclass(df$x)df$x + 10^6。 (请注意,我在函数中进行了更正)
    • 我没有打电话给df &lt;- data.frame(x = format(x))。只是print.data.frame`调用了format方法来确定如何将data.frame打印到控制台
    • 如果您阅读as.data.frame.factor,它不依赖任何因子属性,它会处理您从向量创建 data.frame 对象所需的一切。
    • 非常感谢。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多