R中的平均值和手动计算之间的差异?

Rov*_*Eye 4 math r

我在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
    }
Run Code Online (Sandbox Code Playgroud)

当您使用随机值a和b运行它时,函数会给出不同的结果

x <- 5
y <- 10
pdiff(x,y) #gives 66%
pdiffa(x,y) #gives 100%
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当我进入代码时,显然(x + y)/ 2 = 7.5和mean(x,y)= 5的值不同......我错过了一些非常明显和愚蠢的东西吗?

在此输入图像描述

Ben*_*ker 12

这是由于在一个讨厌的"疑难杂症" mean()的功能(在上市[R陷阱的名单,但可能应该是):你想mean(c(a,b)),没有mean(a,b).来自?mean:

mean(x,...)
[ snip snip snip ]
...传递给其他方法或从其他方法传递的其他参数.

那么如果你打电话mean(5,10)会怎么样?mean调用mean.default方法,该方法具有trim第二个参数:

trim在计算平均值之前从x的每一端修剪的观测值的分数(0到0.5).该范围之外的trim值被视为最近的端点.

最后一个短语"该范围之外的修剪值被视为最近的端点"意味着trim大于0.5的值被设置为0.5,这意味着我们要求mean在数据的任一端丢弃50%的数据设置,这意味着剩下的就是中位数.调试我们的方式mean.default,我们看到我们确实最终在这个代码...

if (trim >= 0.5) 
      return(stats::median(x, na.rm = FALSE))
Run Code Online (Sandbox Code Playgroud)

所以mean(c(x,<value_greater_than_0.5>))返回中位数c(5),这只是5 ......


nei*_*fws 5

mean(5, 10)自己试试。

mean(5, 10)
[1] 5
Run Code Online (Sandbox Code Playgroud)

现在试试mean(c(5, 10))

mean(c(5, 10))
[1] 7.5
Run Code Online (Sandbox Code Playgroud)

mean 将一个向量作为它的第一个参数。