R:使用带有两个以上对象的all.equal

时间:2017-03-22 17:46:08

标签: r

当我使用identical比较两个以上的对象时,结果是有意义的,但我不明白all.equal正在做什么。 all.equal输出的结果背后的逻辑是什么?

identical(25 + 2, 27)  #TRUE -- makes sense
identical(25, 2, 27)   #FALSE -- makes sense
identical(27, 22, 27)  #FALSE -- makes sense

all.equal(25 + 2, 27)  #TRUE -- makes sense
all.equal(25, 2, 27)   #TRUE -- why?
all.equal(27, 22, 27)  #TRUE -- why?

如果最后两个all.equal()测试中的任何一个是假的,我会理解R在做什么 - 测试对象的总和是否相等(25 + 2 == 27)或测试是否有任何两个对象是相等的(27 == 27)。

什么是all.equal测试,以便最后两个方程都是真的?

1 个答案:

答案 0 :(得分:0)

上述评论似乎是正确的。参数按顺序排列,第三个参数指定为公差。但是,以下结果显得更加陌生。

all.equal(target=25, current=2, 5) 
[1] TRUE

all.equal(target=25, current=2, tolerance=5) 
[1] TRUE

这里,公差明显小于差值,但仍然返回TRUE。如果我们将公差降低到更小,我们就会得到

all.equal(target=25, current=2, tolerance=.05) 
[1] "Mean relative difference: 0.92"

发生的是相对差异是根据目标参数的平均值计算的。从帮助文件中,

  

比例= NULL(默认值)的数值比较通常在相对差异比例上,除非目标值接近于零:首先,计算两个数值向量的平均绝对差值。如果这小于容差或不是有限的,则使用绝对差值,否则相对差异按平均绝对目标值缩放。 (请注意,这些比较仅针对目标不是NA并且与当前不同的那些矢量元素计算。)

因此,反转目标和当前参数,我们得到

all.equal(target=2, current=25, tolerance=5) 
[1] "Mean absolute difference: 23"

这是我们可能期望的。

请注意,我们也可以通过将scale参数设置为1来实现此目的:

all.equal(target=25, current=2, tolerance=5, scale=1) 
[1] "Mean absolute difference: 23"

或仅命名比例,

all.equal(25, 2, 5, scale=1) 
[1] "Mean absolute difference: 23"

重申了OP中的评论。