gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:29:32 26 4
gpt4 key购买 nike

我正在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com