我发现自己必须经常这样做 - 比较来自2个不同文件的特定列。列,格式相同,但需要比较的列具有浮点/指数格式数据,例如, 0.0058104642437413175
,-3.459017050577087E-4
等
我目前正在使用以下R代码:
test <- read.csv("C:/VBG_TEST/testing/FILE_2010-06-16.txt", header = FALSE, sep = "|", quote="\"", dec=".")
prod <- read.csv("C:/VBG_PROD/testing/FILE_2010-06-16.txt", header = FALSE, sep = "|", quote="\"", dec=".")
sqldf("select sum(V10), sum(V15) from test")
sqldf("select sum(V10), sum(V15) from prod")
我读了文件,并将特定列 - V10
,V15
相加,然后观察值。这样我可以忽略每行浮点数据的非常小的差异。
然而,未来,我想设置一个容差百分比,即。 if abs( (prod.V10 - test.V10)/prod.V10 ) > 0.01%
,仅打印超出此容差限制的行号。
此外,如果数据不是合理的顺序,我如何通过指定将作为复合主键的列来进行比较?
例如,如果我在Sybase中这样做,我会写一些类似的东西:
select A.*, B.*
from tableA A, tableB B
where abs( (A.Col15-B.Col15)/A.Col15) ) > 0.01%
and A.Col1 = B.Col1
and A.Col4 = B.Col4
and A.Col6 = B.Col6
如果我尝试使用 R 中的sqldf
执行相同的操作,则它不起作用,因为文件包含 500K + 数据行。
有人能指出我如何在R中完成上述工作吗?
非常感谢, Chapax。
答案 0 :(得分:1)
Au,这个sqldf
让我大吃一惊 - 更好地使用普通R功能而不是用SQL折磨自己:
which(abs(prod$V10-test$V10)/prod$V10>0.0001)
更通用的版本:
which(abs(prod[,colTest]-test[,colTest])/prod[,colTest]>tolerance)
其中colTest
是您要测试的列的索引,tolerance
是容差。
答案 1 :(得分:0)
我不知道R,但我建议将此作为一般建议。您应该对表进行分页,然后使用查询。我的意思是,我认为一般来说,在一个大的表上执行特定的比较指令是不明智的。