关于简单看似无辜的函数的简单问题:summary
。
在我看到Min和Max的结果超出我的数据范围之前,我不知道summary
有一个digits
参数来指定输出结果的精度。我的问题是如何以一种干净,普遍的方式解决这个问题。
以下是此问题的示例:
set.seed(0)
vals <- 1 + 10 * 1:50000
df <- cbind(rnorm(10000),sample(vals, 10000), runif(10000))
应用summary
和range
,我们得到以下输出 - 请注意范围值与最小值和最大值之间的差异:
> apply(df, 2, summary)
[,1] [,2] [,3]
Min. -3.703000 11 6.791e-05
1st Qu. -0.668500 122800 2.498e-01
Median 0.009778 248000 5.014e-01
Mean 0.010450 248800 5.001e-01
3rd Qu. 0.688800 374000 7.502e-01
Max. 3.568000 499900 9.999e-01
> apply(df, 2, range)
[,1] [,2] [,3]
[1,] -3.703236 11 6.790622e-05
[2,] 3.568101 499931 9.998686e-01
在summary
中看到错误的范围有点令人不安,所以我查看了digits
选项,但这只是格式化输出的标准符号。 另请注意:除Min之外的每个分位数都显示 在数据集中不存在的值 (这就是为什么我放了{{在1 +
)的定义中,也不会在大多数标准分位数计算中看到这些分位数,甚至允许中点选择的差异。 (当我在原始数据中看到这个时,我想知道我从一切中失去了1的值!)
可解释的计算行为(即格式和精确度)与统计推断的expecations 之间存在差异(此类值被识别为分位数实际上在数据集的范围内) )。由于我们无法改变期望,我们需要改变代码的行为或至少改进它。
问题:是否有一些更合适的方法来设置输出以确定范围,而不是将其设置为较大的值,例如vals
? 16甚至是最合适的普遍默认值吗?使用16位数似乎是双浮点精度的最佳保证,但看起来输出实际上不会有16位数(输出似乎仍然被截断为8位或9位)。
更新1:正如@BrianDiggs所指出的那样,通过链接记录了行为,但出乎意料。为了澄清我的问题,相对于Brian提供的链接上的答案(除了Brian自己的回答):并不是行为没有记录,但是将Min和Max值表示为Min和Max是完全错误的。在默认设置中提供错误输出的文档化功能需要与非默认设置一起使用(或不应使用)。 (也许有人可能会争论“Min”和“Max”是否应该重命名为“Approximate Min”和“Approximate Max”,但是我们不要去那里。)
更新2:正如@Dwin所说,digits = 16
作为默认summary()
。我之前错误地说默认值是3.有趣的是,这意味着 两种方式 来设置输出的行为。如果我们使用两者,行为会变得奇怪:
max(3, getOption("digits") - 3)
请注意,即使传递的参数指定了10位精度,现在这也有20位输出。如果我们将数字的全局选项设置为像16这样的“理智”值,如果我们为> options(digits = 20)
> apply(df, 2, summary, digits = 10)
[,1] [,2] [,3]
Min. -3.7032358429999998605808 11.00000000000000 6.7906221370000004927e-05
1st Qu. -0.6684710537000000396546 122798.50000000000000 2.4977348059999998631e-01
Median 0.0097783099960000001427 247971.00000000000000 5.0137970539999998643e-01
Mean 0.0104475229200000005458 248776.38699999998789 5.0011818200000002221e-01
3rd Qu. 0.6887842181000000119084 374031.00000000000000 7.5024240300000000214e-01
Max. 3.5681007909999999938577 499931.00000000000000 9.9986864070000003313e-01
提供参数10,我们仍会遇到问题。
我认为文档不完整,Brian Diggs在与R-help链接的深思熟虑的答案中指出了其他问题。
尽管存在这些皱纹,但问题依然存在,但也许无法回答。我怀疑最好的结果只是按原样保留全局数字选项(虽然我对上述行为的含义有点不安),而是将值16传递给summary
。在指定输出精度的位置并不是很明显,但是这4个值的相互作用 - 全局选项(和全局选项-3),传递的值以及summary
中的12的硬编码值看起来像(让我的灵魂来说这个)是一个黑客。
更新3:我接受了DWin的回答 - 这让我了解了这款香肠是如何制作的。看到发生的事情,我认为没有办法按照我的要求做,而不能重写summary.data.frame
。
答案 0 :(得分:14)
summary.data.frame
的默认值不是数字= 3,而是:
... max(3, getOption("digits") - 3) # set in the argument list
getOption("digits") # the default setting
[1] 7
options(digits=10)
> summary(df)
V1 V2 V3
Min. :-3.70323584 Min. : 11.0 Min. :6.790622e-05
1st Qu.:-0.66847105 1st Qu.:122798.5 1st Qu.:2.497735e-01
Median : 0.00977831 Median :247971.0 Median :5.013797e-01
Mean : 0.01044752 Mean :248776.4 Mean :5.001182e-01
3rd Qu.: 0.68878422 3rd Qu.:374031.0 3rd Qu.:7.502424e-01
Max. : 3.56810079 Max. :499931.0 Max. :9.998686e-01