使用R比较2个不同文件中的特定列

时间:2010-07-02 12:04:12

标签: r sybase

我发现自己必须经常这样做 - 比较来自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")

我读了文件,并将特定列 - V10V15相加,然后观察值。这样我可以忽略每行浮点数据的非常小的差异。

然而,未来,我想设置一个容差百分比,即。 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。

2 个答案:

答案 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,但我建议将此作为一般建议。您应该对表进行分页,然后使用查询。我的意思是,我认为一般来说,在一个大的表上执行特定的比较指令是不明智的。