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

时间:2017-03-28 22:14:13

标签: r math

我在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%

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:12)

这是由于mean()函数中的一个讨厌的“陷阱”({{3>}中列出的,但可能应该是这样):你想要{{1} },而不是mean(c(a,b))。来自mean(a,b)

  

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

那么如果你致电...会怎样? mean(5,10)调用mean方法,其中mean.default为第二个参数:

  

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

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

mean.default

所以if (trim >= 0.5) return(stats::median(x, na.rm = FALSE)) 会返回mean(c(x,<value_greater_than_0.5>))的中位数,这只是5 ...

答案 1 :(得分:4)

单独试试public static int exponentWithHeight(int base, int power, int height) { if (power < 0 || height < 0) { throw new IllegalArgumentException("Invalid Input; Check power and/or height value."); } if (power == 0 || height == 0) { return 1; } else { return (int) Math.pow(base, Math.pow(power, height)); } }

mean(5, 10)

现在尝试mean(5, 10) [1] 5

mean(c(5, 10))

mean(c(5, 10)) [1] 7.5 将向量作为其第一个参数。