【问题标题】:Rounding summarize function results in error舍入汇总函数导致错误
【发布时间】:2016-05-09 00:07:38
【问题描述】:

尝试使用来自rockchalk 包的summarize 输出汇总统计信息。 希望统计数据四舍五入到小数点后两位。我收到一条错误消息 在summarize 上使用round

library(rockchalk)
M1 <- structure(c(0.18, 0.2, 0.24, 0.35, -0.22, -0.17, 0.28, -0.28, -0.14, 0.03, 0.87, -0.2, 0.06, -0.1, -0.72, 0.18, 0.01, 0.31, -0.36, 0.61, -0.16, -0.07, -0.13, 0.01, -0.09, 0.26, -0.14, 0.08, -0.62, -0.2, 0.3, -0.21, -0.11, 0.05, 0.06, -0.28, -0.27, 0.17, 0.42, -0.05, -0.15, 0.05, -0.07, -0.22, -0.34, 0.16, 0.34, 0.1, -0.12, 0.24, 0.45, 0.37, 0.61, 0.9, -0.25, 0.02), .Dim = c(56L, 1L))

#This works
round(apply(M1, 2, mean),2)

#This works
summaryround <- function(x) {round(summary(x),2)} 
apply(M1, 2, summaryround)

#This gives error "non-numeric argument"
round(apply(M1, 2, summarize),2)

#Thought this would work but also gives error "non-numeric argument"
summarizeround <- function(x) {round(summarize(x),2)} 
apply(M1, 2, summarizeround)

有什么想法吗?我可以将summary 的输出四舍五入,但想使用summarize 如果可能的话,我想在同一个打印输出中获得峰度和偏度的输出(当然,可以创建我自己的函数,结合 summarykurtosis 以及我想要的任何东西,而不是如果可以避免的话)。


编辑:应该提到在大型数据帧上实际运行它;将其转换为 1 列矩阵,因为我认为这会使可重现的示例更简单。

【问题讨论】:

    标签: r rounding apply


    【解决方案1】:

    您只需从summarize 结果中提取numerics 字段。此外,我更喜欢使用lapply 来保留结果的行名,如果您有多个要汇总的列,我更喜欢使用do.call(bind,...)

    summarizeround <- function(x) {round(summarize(x)$numerics,2)} 
    summaryDf <- do.call(cbind, lapply(as.data.frame(M1), summarizeround))
    
                 x
    0%       -0.72
    25%      -0.16
    50%       0.02
    75%       0.24
    100%      0.90
    mean      0.04
    sd        0.32
    var       0.10
    skewness  0.45
    kurtosis  0.56
    NA's      0.00
    N        56.00
    

    【讨论】:

    • Psidom 你知道如何保留列名而不是得到一个“x”吗?您的代码效果很好,但我在一个有几百列的数据框上运行它,需要这些列名。谢谢!
    • 您可以通过summaryList &lt;- lapply(as.data.frame(M1), summarizeround); summaryDf &lt;- as.data.frame(do.call(cbind, summaryList))将摘要分为两步,然后将名称分配给reuslt数据框names(summaryDf) &lt;- names(summaryList)
    【解决方案2】:

    ?rockchalk::summarize 表示参数是一个数据框。所以,让 M1 成为一个数据框

    M1<-as.data.frame(M1)
    summarize(M1)
    
    $numerics
                  V1
    0%       -0.7200
    25%      -0.1625
    50%       0.0150
    75%       0.2400
    100%      0.9000
    mean      0.0400
    sd        0.3152
    var       0.0993
    skewness  0.4485
    kurtosis  0.5626
    NA's      0.0000
    N        56.0000
    
    $factors
    NULL
    

    并得到四舍五入

    > round(summarize(M1)[[1]],2)
                V1
    0%       -0.72
    25%      -0.16
    50%       0.02
    75%       0.24
    100%      0.90
    mean      0.04
    sd        0.32
    var       0.10
    skewness  0.45
    kurtosis  0.56
    NA's      0.00
    N        56.00
    

    【讨论】:

    • 什么是 rockchalk 故障信息?
    • 运行round(summarize(M1),2) 给出了同样的错误。该代码适用于大量列,因此无法选择第 1 列。无论如何都非常感谢!
    猜你喜欢
    • 2020-08-15
    • 2020-09-20
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2022-11-01
    相关资源
    最近更新 更多