2015-09-15 8 views
0

Я написал сценарий для чтения файла с диска и проверки значений в нем и записи 3 других файлов на диске. К сожалению, что-то, что казалось очень прямым, стало головной болью. Код:read.table, diff и intersect error

Arqcodnegs ="result/lista_de_codnegs.txt" 
dirout = "./result/" 
Codnegs_fornecidos = c("ABC", "A1B2", "PETR3") 

Verifica_codneg = function (Codnegs_fornecidos, Arqcodnegs) { 

    if (!file.exists(Arqcodnegs)) { 
    stop("Falta arquivo lista_de_codnegs.txt") 
    } 

    Codnegs_lidos = read.table(Arqcodnegs,header=FALSE, sep='\t', quote='\"', stringsAsFactors=TRUE) 

    Codnegs_negativos = c(setdiff (Codnegs_fornecidos, Arqcodnegs)) 

    Codnegs_positivos = c(intersect (Codnegs_fornecidos, Arqcodnegs)) 

    write.table(Codnegs_lidos, paste(dirout, "lista_de_codnegs_lidos.txt", sep=''), col.names=FALSE, row.names=FALSE, sep='\t') 

    write.table(Codnegs_negativos, paste(dirout, "lista_de_codnegs_negativos.txt", sep=''), col.names=FALSE, row.names=FALSE, sep='\t') 

    write.table(Codnegs_positivos, paste(dirout, "lista_de_codnegs_positivos.txt", sep=''), col.names=FALSE, row.names=FALSE, sep='\t') 

} 

Файл "lista_de_codnegs.txt" имеет следующие значения в нем:

"PDGR3" "PETR3" "PETR4"

Как и ожидалось, файл " lista_de_codnegs_lidos.txt "возвращает соответствующие значения в одном столбце, что означает« PDGR3 »,« PETR3 »и« PETR4 ».

Но, основными проблемами являются:

  1. Файл "lista_de_codnegs_negativos.txt" возвращает "ABC", "A1B2", "PETR3", но он должен был возвратить "ABC" и «A1B2 ", только.

  2. Файл «lista_de_codnegs_positivos.txt» не возвращает значений, но должен возвращать «PETR3».

Что я делаю неправильно?

+1

Вы ocmparing для 'Arqcodnegs', который не содержит ни одной из переменных из' Codnegs_fornecidos'. Итак, ожидаемое поведение. С чем вы действительно хотите сравнить? colnames codnegs_lidos? – Heroka

+0

Я хочу проверить, можно ли найти Codnegs_fornecidos в файле Arqcodnegs. Найденные Codnegs_fornecidos записываются в файл Codnegs_positivos, а те, которые не найдены, записываются в файл Codnegs_negativos. – Newbie1971

+0

Вы можете сделать 'codnegs_negativos = setdiff (codnegs_fornecidos, codnegs_lidos)', но зависит от того, как выглядят ваши данные. – Heroka

ответ

0

Ваш вопрос здесь, как уже упоминалось @Heroka изменения Arqcodnegs к Codnegs_lidos и он будет функционировать правильно, как Arqcodnegs строка символов со ссылкой на путь к файлу. В качестве такого setdiff() ищет, чтобы найти разницу между строкой символов и объектом Codnegs_fornecidos

Codnegs_negativos = c(setdiff (Codnegs_fornecidos, Arqcodnegs)) 

    Codnegs_positivos = c(intersect (Codnegs_fornecidos, Arqcodnegs)) 

** EDIT: Этот код должен получить то, что вы после этого.

Arqcodnegs ="result/lista_de_codnegs.txt" 
dirout = "./results/" 
dir.create(dirout) 
Codnegs_fornecidos = c("ABC", "A1B2", "PETR3") 

Verifica_codneg = function (Codnegs_fornecidos, Arqcodnegs) { 


    Codnegs_lidos = read.table(Arqcodnegs,header=FALSE, sep='\t', quote='\"', stringsAsFactors=TRUE) 

    Codnegs_negativos = c(setdiff (Codnegs_fornecidos, Codnegs_lidos)) 

    Codnegs_positivos = c(intersect (Codnegs_fornecidos, Codnegs_lidos)) 

    write.table(Codnegs_lidos, paste(dirout, "lista_de_codnegs_lidos.txt", sep=''), col.names=FALSE, row.names=FALSE, sep='\t') 

    write.table(Codnegs_negativos, paste(dirout, "lista_de_codnegs_negativos.txt", sep=''), col.names=FALSE, row.names=FALSE, sep='\t') 

    write.table(Codnegs_positivos, paste(dirout, "lista_de_codnegs_positivos.txt", sep=''), col.names=FALSE, row.names=FALSE, sep='\t') 

} 

Verifica_codneg(Codnegs_fornecidos = Codnegs_fornecidos, Arqcodnegs = Arqcodnegs) 
+0

Я изменил, как указано, и он не возвращает соответствующий ответ. То, что я получил это:> Codnegs_positivos символ (0) > Codnegs_negativos [1] "результат/lista_de_codnegs.txt" > – Newbie1971

+3

Это буквально код OP писал. – Heroka

+1

Символьная строка, в контексте вопроса, является местом назначения. Я вижу, откуда вы пришли, и отрегулирует мою формулировку, так как технически это просто символьная строка, спасибо. – Badger