有两个数据框,如:
第一个数据框:
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的耐受性是3
或40%
,d3的耐受值是2
或30%
和d2'1'或23%
。虽然比较必须通过这些公差值。
帮我解决这个问题。尽一切努力都是值得的。
如果我理解正确你正在寻找相同的功能。如果两个对象相同,则进行相同的测试。
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)
此函数测试具有相同名称或位于相同位置的列是否大于或小于指定阈值的不同。
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 )