R - 摘要(数据)和摘要(数据$变量)的差异

R - Discrepancy in summary(data) and summary(data$variable)

我有一个 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 

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

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

digits: integer, used for number formatting with signif() (for summary.default) or format() (for 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 参数值时 4summary.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