我正在 R 中编写一个简单的函数来计算两个输入数字之间的百分比差异。
pdiff <-function(a,b)
{
if(length(a>=1)) a <- median(a)
if(length(b>=1)) b <- median(b)
(abs(a-b)/((a+b)/2))*100
}
pdiffa <-function(a,b)
{
if(length(a>=1)) a <- median(a)
if(length(b>=1)) b <- median(b)
(abs(a-b)/mean(a,b))*100
}
当您使用 a 和 b 的随机值运行它时,函数会给出不同的结果
x <- 5
y <- 10
pdiff(x,y) #gives 66%
pdiffa(x,y) #gives 100%
当我进入代码时,显然 (x+y)/2 = 7.5 和 mean(x,y) = 5 的值不同......我在这里错过了一些非常明显和愚蠢的东西吗?
最佳答案
这是由于 mean()
中的一个讨厌的“陷阱”。功能(未在 list of R traps 中列出,但可能应该是):您想要 mean(c(a,b))
,而不是 mean(a,b)
.来自 ?mean
:
mean(x, ...)
[snip snip snip]
...
further arguments passed to or from other methods.
那么如果你调用
mean(5,10)
会发生什么? ? mean
调用mean.default
方法,它有 trim
作为它的第二个论点:
trim
the fraction (0 to 0.5) of observations to be trimmed from each end of x before the mean is computed. Values of trim outside that range are taken as the nearest endpoint.
最后一个短语“该范围之外的修剪值被视为最近的端点”意味着
trim
的值大于 0.5 被设置为 0.5,这意味着我们要问 mean
丢弃 50% 的数据 在数据集的任一端 ,这意味着剩下的就是中位数。通过 mean.default
调试我们的方式,我们看到我们确实最终得到了这个代码......if (trim >= 0.5)
return(stats::median(x, na.rm = FALSE))
所以
mean(c(x,<value_greater_than_0.5>))
返回 c(5)
的中位数, 这只是 5 ...
关于r - R中的平均值和手动计算之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43080915/