用于比较数据框中的列的函数,提供有关现有差异的信息

Function for comparing colums in a dataframe, giving information about existing differences

我正在尝试编写一个函数来比较 a 的每一行中两个列(xy)的值数据框。如果值相同,该函数应逐行比较,允许每对值的指定容差 z。 identical() 没有帮助,因为它不允许小的差异。 我也不能使用 all.equal(),因为它的 "tolerance" 参数与所有行的平均差有关,下面的示例就是如此。

> 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

"difference"应该定义差异的可调值范围,"frequency"应该显示具有相应差异的行数。 欢迎就返回有关差异的更详细信息的方式提出其他建议。请注意,我的原始数据框包含大约 2 mio。行,其中一些可能有很大差异。

恕我直言,最简单的方法是使用剪切:

df$diff.cat  <- cut(abs(df$x-df$y),breaks=c(0,1,10,100,1000),right = FALSE)

right = 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