我正在尝试编写一个函数来比较数据帧每一行中两个列(x 和 y)的值。如果值相同,该函数应逐行比较,允许每对值指定公差 z。isameical() 没有帮助,因为它不允许小的差异。我也不能使用 all.equal(),因为它的"容差"参数与所有行的平均差有关,以下示例如何演示。
> df <- data.frame("x"=c(1,2,3,4,5), "y"=c(2,7,3,4,5))
> df$diff_x_y <- df$x-df$y
> df
x y diff_x_y
1 1 2 -1
2 2 7 -5
3 3 3 0
4 4 4 0
5 5 5 0
> all.equal(df$x, df$y, scale=1,tolerance=4)
[1] TRUE
>
所以这就是我到目前为止所编造的:
fun <- function (x, y, z)
{
diff <- abs(x-y) # compute difference for each row
tolerance <- ifelse(diff <= z, TRUE, FALSE) # test whether difference <= tolerance
return(summary(tolerance))
}
这适用于上面的示例数据帧:
> fun(df$x,df$y,1)
Mode FALSE TRUE NA's
logical 1 4 0
现在,我希望该函数能为我提供有关现有差异的一些信息。我想象这样的东西:
difference frequency
1:10 4
11:100 30
101:1000 350
"差值"应该定义差值的可调值范围,"频率"应显示具有相应差值的行数。欢迎就返回有关差异的更详细信息的方式提出其他建议。请注意,我的原始数据帧包含大约 2 mio。行,其中一些可能有很大不同。
我直言,最简单的方法是使用cut:
df$diff.cat <- cut(abs(df$x-df$y),breaks=c(0,1,10,100,1000),right = FALSE)
右 = FALSE 开关使间隔包括左(小)边距 -
0 <= 第一个区间<1
1 <= 秒间隔<10 等。
当然可以调整间隔您可以通过以下方式查看频率
table(df$diff.cat)
所以基本上是为了:
df <- data.frame("x"=c(1,2,3,4,5), "y"=c(2,7,3,4,5))
table(cut(abs(df$x-df$y),breaks=c(0,1,10,100,1000),right = FALSE))
将给予:
[0,1) [1,10) [10,100) [100,1e+03)
3 2 0 0