我在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 ......
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 将一个向量作为它的第一个参数。