我在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%
当我进入代码时,显然(x + y)/ 2 = 7.5和mean(x,y)= 5的值不同......我错过了一些非常明显和愚蠢的东西吗? / p>
答案 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
将向量作为其第一个参数。