【问题标题】:R - Discrepancy in summary(data) and summary(data$variable)R - 摘要(数据)和摘要(数据$变量)的差异
【发布时间】:2017-02-04 07:28:26
【问题描述】:

我有一个data set,有 61 个观察值和 2 个变量。当我汇总整个数据时,第二个变量的分位数、中位数、平均值和最大值有时与我仅从第二个变量汇总得到的结果不同。这是为什么呢?

data <- read.csv("testdata.csv")

head(data)
#   Group.1     x
# 1 10/1/12     0
# 2 10/2/12   126
# 3 10/3/12 11352
# 4 10/4/12 12116
# 5 10/5/12 13294
# 6 10/6/12 15420

summary(data)
#   Group.1           x        
# 10/1/12 : 1   Min.   :    0  
# 10/10/12: 1   1st Qu.: 6778  
# 10/11/12: 1   Median :10395  
# 10/12/12: 1   Mean   : 9354  
# 10/13/12: 1   3rd Qu.:12811  
# 10/14/12: 1   Max.   :21194  
# (Other) :55             

summary(data[2])
#       x        
# Min.   :    0  
# 1st Qu.: 6778  
# Median :10395  
# Mean   : 9354  
# 3rd Qu.:12811  
# Max.   :21194  

# The following code yield different result:

summary(data$x)
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
# 0    6778   10400    9354   12810   21190 

【问题讨论】:

  • 您的调用等效于(在 S3 解析之后)summary.data.frame(data[2])summary.default(data$x)。函数的定义略有不同,统计数据也略有不同。计算四分位数取决于数字向量的长度,“取决于解释”,并非 R 中的所有函数都做出与彼此或您相同的假设。要么找到你喜欢的方法,要么自己计算(在阅读?quantile了解一些细节之后)。

标签: r summary


【解决方案1】:

@r2evans 的评论是正确的,因为差异是由 summary.data.framesummary.default 的差异引起的。

digits 这两种方法的默认值都是max(3L, getOption("digits") - 3L)。如果您没有更改您的选项,这将评估为4L。但是,这两种方法在格式化输出时使用它们的digits 参数不同,这就是两种方法输出不同的原因。来自?summary

digits:整数,用于使用signif()(用于summary.default)或format()(用于summary.data.frame)的数字格式。

假设我们在问题中有x的摘要统计向量:

q <- append(quantile(data$x), mean(data$x), after = 3L)
q
##   0%      25%      50%               75%     100% 
## 0.00  6778.00 10395.00  9354.23 12811.00 21194.00 

summary.default 中,输出使用signif 进行格式化,将其输入四舍五入为提供的有效digits 数量:

signif(q, digits = 4L)
## 0%   25%   50%         75%  100% 
##  0  6778 10400  9354 12810 21190 

虽然summary.data.frame 使用format,但它仅将digits 参数用作建议 (?format) 来显示要显示的有效位数:

format(q, digits = 4L)
##      0%     25%     50%             75%    100% 
## "    0" " 6778" "10395" " 9354" "12811" "21194"

因此,当使用默认的digits 参数值4 时,summary.default(data$x) 会将 5 位分位数舍入为仅 4 位有效数字;但summary.data.frame(data[2]) 显示 5 位数的分位数,不进行四舍五入。

如果您明确提供大于 4 的 digits 参数,您将获得相同的结果:

summary(data[2], digits = 5L)
##        x          
## Min.   :    0.0  
## 1st Qu.: 6778.0  
## Median :10395.0  
## Mean   : 9354.2  
## 3rd Qu.:12811.0  
## Max.   :21194.0  

summary(data$x, digits = 5L)
##   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.0  6778.0 10395.0  9354.2 12811.0 21194.0 

作为两个方法与默认digits的区别的极端例子:

df <- data.frame(a = 1e5 + 0:100)

summary(df$a)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  100000  100000  100000  100000  100100  100100 

summary(df)
##       a         
## Min.   :100000  
## 1st Qu.:100025  
## Median :100050  
## Mean   :100050  
## 3rd Qu.:100075  
## Max.   :100100 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2014-04-14
    相关资源
    最近更新 更多