r - R中的平均值和手动计算之间的区别?

标签 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 的值不同......我在这里错过了一些非常明显和愚蠢的东西吗?

enter image description here

最佳答案

这是由于 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/

相关文章:

r - 在 R 中使用 igraph 进行引文网络中的主要路径分析

math - 将 3D 点转换为 2D

javascript - 使用由日期触发的 style.display

r - 每个观察的百分位数 w/r/t 分组变量

python - pygame 在两点之间创建弧

math - 从 3D 多边形和法线获取平面

vb.net - 三次贝塞尔曲线-给定X可获得Y

r - 在多边形形状文件中创建随机点

r - 如何按日期在 R 中对大型数据框 (ffdf) 进行子集化?

r - 升级 R/R Studio 后出现 fatal error (无效的事件开发人员路径)