2013-04-02 9 views
7

Sto leggendo in un file di dati che assomiglia a questo:Tecnica per la ricerca di dati non corretti in read.csv in R

userId, fullName,email,password,activated,registrationDate,locale,notifyOnUpdates,lastSyncTime,plan_id,plan_period_months,plan_price,plan_exp_date,plan_is_trial,plan_is_trial_used,q_hear,q_occupation,pp_subid,pp_payments,pp_since,pp_cancelled,apikey 
"2","John Smith,"[email protected]","a","1","2004-07-23 14:19:32","en_US","1","2011-04-07 07:29:17","3",\N,\N,\N,"0","1",\N,\N,\N,\N,\N,\N,"d7734dce-4ae2-102a-8951-0040ca38ff83" 

ma il file effettivo come intorno 20000 record. Io uso il seguente codice R per leggerlo in:

user = read.csv("~/Desktop/dbdump/users.txt", na.strings = "\\N", quote="") 

E la ragione per cui ho quote="" è perché senza di essa l'importazione ferma prematuramente. Finisco con un totale di 9569 osservazioni. Perché non capisco perché esattamente il quote="" risolve questo problema, è sembra farlo.

Tranne che introduce altri problemi che devo "risolvere". Il primo che ho visto è che le date finiscono per essere stringhe che includono le virgolette, che non si vogliono convertire in date reali quando io uso to.Date() su di esse.

Ora potevo sistemare le corde e incastrarmi. Ma meglio sapere di più su quello che sto facendo. Qualcuno può spiegare:

  1. Perché il quote="" fissare i 'cattivi' dei dati
  2. Che è una tecnica di best-practice per capire che cosa sta causando il read.csv per fermare presto? (Se guardo i dati di input a +/- la riga indicata, non vedo nulla di sbagliato).

Queste sono le righe "vicine" al "problema". Non vedo il danno, vero?

"16888","user1","[email protected]","TeilS12","1","2008-01-19 08:47:45","en_US","0","2008-02-23 16:51:53","1",\N,\N,\N,"0","0","article","student",\N,\N,\N,\N,"ad949a8e-17ed-102b-9237-0040ca390025" 
"16889","user2","[email protected]","Gaspar","1","2008-01-19 10:34:11","en_US","1",\N,"1",\N,\N,\N,"0","0","email","journalist",\N,\N,\N,\N,"8b90f63a-17fc-102b-9237-0040ca390025" 
"16890","user3","[email protected]","boomblaadje","1","2008-01-19 14:36:54","en_US","0",\N,"1",\N,\N,\N,"0","0","article","student",\N,\N,\N,\N,"73f31f4a-181e-102b-9237-0040ca390025" 
"16891","user4","[email protected]","mytyty","1","2008-01-19 15:10:45","en_US","1","2008-01-19 15:16:45","1",\N,\N,\N,"0","0","google-ad","student",\N,\N,\N,\N,"2e48e308-1823-102b-9237-0040ca390025" 
"16892","user5","[email protected]","08091969","1","2008-01-19 15:12:50","en_US","1",\N,"1",\N,\N,\N,"0","0","dont","dont",\N,\N,\N,\N,"79051bc8-1823-102b-9237-0040ca390025" 

* Aggiornamento *

E 'più difficile. Anche se il numero totale di righe importate è 9569, se guardo le ultime righe corrispondono alle ultime righe di dati. Pertanto suppongo che durante l'importazione qualcosa sia accaduto per causare un sacco di righe da saltare. Infatti 15914 - 9569 = 6345 record. Quando ho la citazione = "" lì ottengo 15914.

Quindi la mia domanda può essere modificata: C'è un modo per ottenere read.csv per segnalare le righe che decide di non importare?

* UPDATE 2 *

@Dwin, ho dovuto togliere na.strings = "\ n" perché la funzione count.fields non lo consente. Con ciò, ottengo questo risultato che sembra interessante ma non lo capisco.

3  4 22 23 24 
1 83 15466 178  4 

tuo secondo comando produce un sacco di dati (e si ferma al raggiungimento max.print). Ma la prima riga è questo:

[1] 2 4 2 3 5 3 3 3 5 3 3 3 2 3 4 2 3 2 2 3 2 2 4 2 4 3 5 4 3 4 3 3 3 3 3 2 4 

Il che non capisco se l'uscita è dovrebbe mostrare quanti campi ci sono in ogni record di input. Chiaramente le prime linee hanno tutti più di 2,4,2 campi ecc ... Mi sento come se mi stavo avvicinando, ma ancora confuso!

+2

Puoi mostrarci come sono i dati prima di 'quote =" "' e dopo? Oppure, puoi pubblicare qualche riga in più dei tuoi dati, preferibilmente alcuni "sani" e alcuni negativi? In breve, puoi fare un esempio riproducibile? –

+0

Io voto per le virgolette incorporate! – Justin

+0

@roman: il problema è che non so dove siano i dati cattivi. Posso mostrarti le righe +/- 9569 e forse vedrai cosa mi manca. – pitosalas

risposta

4

Un problema che ho individuato (grazie a data.table) è la citazione mancante (") dopo John Smith. Potrebbe essere un problema anche per le altre linee che hai?

Se aggiungo il preventivo "mancante" dopo John Smith, legge correttamente.

ho salvati questi dati per data.txt:

userId, fullName,email,password,activated,registrationDate,locale,notifyOnUpdates,lastSyncTime,plan_id,plan_period_months,plan_price,plan_exp_date,plan_is_trial,plan_is_trial_used,q_hear,q_occupation,pp_subid,pp_payments,pp_since,pp_cancelled,apikey 
"2","John Smith","[email protected]","a","1","2004-07-23 14:19:32","en_US","1","2011-04-07 07:29:17","3",\N,\N,\N,"0","1",\N,\N,\N,\N,\N,\N,"d7734dce-4ae2-102a-8951-0040ca38ff83" 
"16888","user1","[email protected]","TeilS12","1","2008-01-19 08:47:45","en_US","0","2008-02-23 16:51:53","1",\N,\N,\N,"0","0","article","student",\N,\N,\N,\N,"ad949a8e-17ed-102b-9237-0040ca390025" 
"16889","user2","[email protected]","Gaspar","1","2008-01-19 10:34:11","en_US","1",\N,"1",\N,\N,\N,"0","0","email","journalist",\N,\N,\N,\N,"8b90f63a-17fc-102b-9237-0040ca390025" 
"16890","user3","[email protected]","boomblaadje","1","2008-01-19 14:36:54","en_US","0",\N,"1",\N,\N,\N,"0","0","article","student",\N,\N,\N,\N,"73f31f4a-181e-102b-9237-0040ca390025" 
"16891","user4","[email protected]","mytyty","1","2008-01-19 15:10:45","en_US","1","2008-01-19 15:16:45","1",\N,\N,\N,"0","0","google-ad","student",\N,\N,\N,\N,"2e48e308-1823-102b-9237-0040ca390025" 
"16892","user5","[email protected]","08091969","1","2008-01-19 15:12:50","en_US","1",\N,"1",\N,\N,\N,"0","0","dont","dont",\N,\N,\N,\N,"79051bc8-1823-102b-9237-0040ca390025" 

E questo è un codice. Entrambi fread e read.csv funzionano correttamente.

require(data.table) 

dat1 <- fread("data.txt", header = T, na.strings = "\\N") 
dat1 

dat2 <- read.csv("data.txt", header = T, na.strings = "\\N") 
dat2 
4

La funzione count.fields può essere molto utile per identificare dove cercare dati malformati.

Questo dà una tabulazione dei campi per riga ignora citando, forse un problema se ci sono incorporati virgole:

table(count.fields("~/Desktop/dbdump/users.txt", quote="", sep=",")) 

Questo dà una tabulazione ignorando sia le citazioni e "#" (cancelletto) come un carattere di commento:

table(count.fields("~/Desktop/dbdump/users.txt", quote="", comment.char="")) 

atfer vedere ciò che si segnala per la prima tabulazione ..... la maggior parte dei quali erano, se lo desideri ... si può ottenere una lista delle posizioni della linea con i non-valori 22 (usando la virgola e non -quote impostazioni):

which(count.fields("~/Desktop/dbdump/users.txt", quote="", sep=",") != 22) 

A volte il problema può essere risolto con fill=TRUE se l'unica difficoltà è mancante di virgole alle estremità delle linee.

+0

Questa è una versione molto migliore del mio suggerimento. +1 –

Problemi correlati