【发布时间】:2020-04-17 19:34:16
【问题描述】:
我有以下玩具数据集(实际数据集约为 500,000 条记录):
library(data.table)
dt <- data.table(Address = c("Gold", "Gold", "Silver", "Silver", "Gold", "Gold", "Copper", "Gold", "Bronze"),
Name = c("Stat1", "Stat1", "Stat1", "Stat1", "Stat1", "Stat1", "Stat1", "Stat1", "Stat1"),
AvgValue = c(0, 0.5, 1.25, 0.75, 1.5, 0.7, 0.41, 0.83, 2.58),
Samples = c(123, 233, 504, 3, 94, 50, 401, 402, 12))
我想做以下事情:
a) 对数据进行子集化,以便我们仅考虑“值”列中大于零的“黄金”记录AND值
b) 使用上面“a”中的过滤数据,打印出百分位数和其他描述性统计数据。
上面执行“a”和“b”的代码如下:
qs = dt[AvgValue > 0 & Address %like% 'Gold',
.(Samples = sum(Samples),
'25th' = quantile(AvgValue, probs = c(0.25)),
'50th' = quantile(AvgValue, probs = c(0.50)),
'75th' = quantile(AvgValue, probs = c(0.75)),
'95th' = quantile(AvgValue, probs = c(0.95)),
'99th' = quantile(AvgValue, probs = c(0.99)),
'99.9th' = quantile(AvgValue, probs = c(0.999)),
'99.99th' = quantile(AvgValue, probs = c(0.9999)),
'Mean' = mean(AvgValue),
'Median' = median(AvgValue),
'StdDev' = sd(AvgValue)),
by = .(Name, Address)]
setkey(qs, 'Name')
打印qs显示:
Name Address Samples 25th 50th 75th 95th 99th 99.9th 99.99th Mean Median StdDev
Stat1 Gold 779 0.65 0.765 0.9975 1.3995 1.4799 1.49799 1.499799 0.8825 0.765 0.4334647
到目前为止,一切都很好。这些来自(小)玩具数据集的值似乎与 MS Excel 中 PERCENTILE() 函数的输出相关联。
编辑: 问题是:当我将此 R 代码应用于更大的数据集时,R 输出的值与 Excel 中的 PERCENTILE() 函数输出的值不相关。在较低的百分位数中,值略有不同。在较高的百分位数中,值显着不同。以下是区别:
25th 50th 75th 95th 99th 99.9th 99.99th
R 0.414442227 0.428557466 0.45030771 1.668065665 42.7787092 146.9633133 349.6416913
Excel 0.414774203 0.429350073 0.448245768 0.971100779 13.31231723 98.75342572 188.2700879
这里有 20 个实际数据点(总共 11,283 个“黄金”行)。这些是降序排列的:
AvgValue
349.1436739
190.189758
175.2157327
158.6492516
132.9550737
132.2686941
126.570912
122.9771829
107.6942185
99.98552912
98.93274272
98.75984129
98.73709105
98.30154271
98.2491005
96.97274385
96.94577839
96.9128099
96.90816688
96.82527478
Excel 中的值似乎“更正确”(尤其是较高的百分位数)。
有人发现我的 R 代码有什么明显错误吗?
如果没有,关于为什么 R 中的值没有与 Excel 中的值绑定的任何想法?
也许是 Quantile() 函数的“类型”参数(我没有传入)?
谢谢!
【问题讨论】:
-
至于为什么 Excel 和 R 可能在某些百分位数上存在分歧,请阅读
?quantile,即type=参数如何选择“九个分位数算法之一”。我不记得哪种类型与 Excel 最兼容,但它们通常会提供不同的值。 -
是的。您需要在分位数中使用
tytpe=6才能获得与 Excel 相同的结果。 -
顺便说一句,为了节省输入,您可以使用
as.list(quantile(AvgValue, probs = c(0.25, .5, .75, .95, .99, .999, .9999), names=FALSE)),它将每个分位数返回一列。如果排除names=FALSE,您将返回名为25%、99.9%等的列,如果可以的话 -
@G5W 如果您对此有参考,那将是一个很好的答案。如果它来自另一个 SO Q&A,请标记为重复 :)
-
@GW5 - 我按照您的建议尝试了 Type=6,但输出不匹配。维基百科 (en.wikipedia.org/wiki/Quantile) 建议 Excel 函数 PERCENTILE() 使用 Type=7。我尝试使用 R=7 并且结果也不匹配。这越来越有趣了……
标签: r excel data.table subset