如何比较不同列的不同容差值的两个数据帧?

问题描述 投票:0回答:2

有两个数据框,如:

第一个数据框:

 d1       d2      d3
694   1.809509    74.9223
695   1.809510    73.2323
696   1.809511    23.7266
2243  1.465000    64.7542
2244  1.465001    85.7634
2651  1.143814    98.6344
2652  1.143813    46.9485

第二个数据框:

  d1       d2     d3
694    1.809509   73.5324
2243   1.465000   72.7854
2652   1.143813   25.4734
2784   1.162545   61.3456
2924   1.989442   88.9845
2846   1.929882   96.3874

我想比较这两个数据帧。我尝试在两个帧上使用all.equal()方法中的单个容差级别。但要求是不同的列具有不同的公差值。例如,d1的耐受性是340%,d3的耐受值是230%和d2'1'或23%。虽然比较必须通过这些公差值。

帮我解决这个问题。尽一切努力都是值得的。

r compare multiple-columns
2个回答
0
投票

如果我理解正确你正在寻找相同的功能。如果两个对象相同,则进行相同的测试。

x <- mtcars
y <- mtcars

identical( x, y )

y[ 3, 5] <- 300

identical( x, y )

您可以为每列循环相同的函数。

for( i in names( x ) ){
    print( identical( x[,i] , y[,i]) )
}

此外,在这种情况下,行和列的顺序相同 - 您可以计算差异

z <- x - y
sapply( z , summary)

0
投票

此函数测试具有相同名称或位于相同位置的列是否大于或小于指定阈值的不同。

x <- mtcars
y <- mtcars

y[ 3, 5] <- 300
y[ 2, 5] <- 4


y[ 3, 6] <- 2.8
y[ 2, 6] <- 4



test <-function( Z , TOL ){ as.numeric( 
    x[ , Z] > ( y[ , Z] * (1+TOL)) | 
    x[ , Z] < ( y[ , Z] * (1-TOL)) 
    )
    }


#compare the whole dataset at 20%
do.call( cbind, lapply( names( x )  , test , .2 ) )

# compare a specific column at 20 and 40 % difference
x$morethan20 <-  test( "drat" , .2 )
x$morethan40 <-  test( "wt" , .4 )
© www.soinside.com 2019 - 2024. All rights reserved.