r语言 - 用于比较数据帧中的列的函数,提供有关现有差异的信息



我正在尝试编写一个函数来比较数据帧每一行中两个列(xy)的值。如果值相同,该函数应逐行比较,允许每对值指定公差 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

相关内容

  • 没有找到相关文章

最新更新