2010-07-02 4 views
2

Мне приходится делать это очень часто - сопоставляйте конкретные столбцы из 2 разных файлов. Столбцы, форматы являются одинаковыми, но столбцы, которые нуждаются в сравнении, имеют данные с плавающей запятой/экспоненциальным форматом, например. 0.0058104642437413175, -3.459017050577087E-4 и т.д.Сравнение конкретных столбцов в двух разных файлах с использованием R

настоящее время я использую ниже 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 

Если я пытаюсь делать то же самое, используя sqldf в R, он не работает, как файлы содержат 500K + строки данных.

Может ли кто-нибудь указать мне, как я могу сделать выше в R?

Большое спасибо, Chapax.

+1

Можете ли вы подробно остановиться на «том же» и «это НЕ работает», пожалуйста? – mdsumner

+0

, пытающийся запустить SQL-код Sybase в sqldf, заставляет R продолжать работать очень и очень долгое время ... и именно поэтому я сказал, что «он НЕ работает». – Chapax

+0

у вас, кажется, есть несколько вопросов; может быть, их разбить? Я не уверен, если у вас возникли проблемы с чтением значений в data.frame или если вы дополнительно ищете ответ, предполагающий, что data.frame полностью реализован в памяти. – ayman

ответ

0

Я не знаю R, но я предлагаю это в качестве общего совета. Вы должны разбивать страницы на таблицу, а затем использовать свой запрос. Я имею в виду, я думаю, что в целом нецелесообразно выполнять конкретные инструкции сравнения за большой таблицей.

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 - допуски.

+0

Большое спасибо mbq ... можете ли вы также сообщить мне, как я могу сортировать по col1, col2 и т. Д.? Это даст мне полное решение. Также, как и в стороне, вы можете предложить хорошие книги/учебные пособия для изучения R? У меня, похоже, много таких проблем с данными, которые я делаю вручную в Excel, и я думаю, что R очень сильно поможет в автоматизации. Thx тонны. – Chapax

+0

Проверьте http://cran.r-project.org/manuals.html, особенно R-введение.Вы также можете найти что-то более короткое в документации Contributed. Сортировка вектора просто 'sort',' order' возвращает вектор индекса отсортированного вектора, поэтому он помогает сортировать кадры данных. R имеет встроенную документацию, выдает '? Sort' или'? Order', чтобы получить дополнительную информацию и примеры. Буду признателен, если вы примете этот ответ. – mbq

+0

Большое спасибо mbq ... Я проверю руководства. – Chapax

Смежные вопросы