2013-08-10 19 views
41

Quando si legge nei miei set di dati in R come segue:Errore nella lettura di set di dati in R

Dataset.df <- read.table("C:\\dataset.txt", header=T) 

ottengo il seguente messaggio di errore:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
    line 1 did not have 145 elements 

Che cosa significa questo e può qualcuno dimmi come aggiustarlo?

risposta

56

Questo errore è abbastanza auto-esplicativo. Sembra che manchino dei dati nella prima riga del tuo file di dati (o seconda riga, a seconda dei casi, dal momento che stai usando header = TRUE).

Ecco un mini esempio:

## Create a small dataset to play with 
cat("V1 V2\nFirst 1 2\nSecond 2\nThird 3 8\n", file="test.txt") 

R rileva automaticamente che deve aspettarsi rownames più due colonne (3 elementi), ma non trova 3 elementi sulla linea 2, in modo da ottenere un errore:

read.table("test.txt", header = TRUE) 
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
# line 2 did not have 3 elements 

sguardo al file di dati e vedere se c'è davvero un problema:

cat(readLines("test.txt"), sep = "\n") 
# V1 V2 
# First 1 2 
# Second 2 
# Third 3 8 

Manua Potrebbe essere necessaria la correzione, oppure possiamo supporre che il valore del primo valore nella riga della riga "Secondo" dovrebbe essere nella prima colonna, mentre altri valori dovrebbero essere NA. Se questo è il caso, fill = TRUE è sufficiente per risolvere il tuo problema.

read.table("test.txt", header = TRUE, fill = TRUE) 
#  V1 V2 
# First 1 2 
# Second 2 NA 
# Third 3 8 

R è anche abbastanza intelligente per capirlo quanti elementi di cui ha bisogno, anche se rownames mancano:

cat("V1 V2\n1\n2 5\n3 8\n", file="test2.txt") 
cat(readLines("test2.txt"), sep = "\n") 
# V1 V2 
# 1 
# 2 5 
# 3 8 
read.table("test2.txt", header = TRUE) 
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
# line 1 did not have 2 elements 
read.table("test2.txt", header = TRUE, fill = TRUE) 
# V1 V2 
# 1 1 NA 
# 2 2 5 
# 3 3 8 
17

Quando si esegue in questo errore e rivedere il mio set di dati che sembrava avere nessun dato mancante, ho scoperto che alcune delle mie voci avevano il carattere speciale "#" che deragliava l'importazione dei dati. Una volta rimosso il "#" dalle celle incriminate, i dati sono stati importati senza problemi.

+10

Si potrebbe anche impostare 'read.table (..., comment.char =" ")' per disattivare l'interpretazione dei commenti nel file. –

+11

Gli apostrofi possono anche causare ('). Risolvi questo problema impostando l'opzione quote = "\" " – Stuart

5

Ho riscontrato questo problema durante l'importazione di alcuni file dall'aggiunta di dati di integrità in R (vedere: http://www.icpsr.umich.edu/icpsrweb/ICPSR/studies/21600?archive=ICPSR&q=21600) Ad esempio, il seguente comando per leggere il file di dati DS12 in formato .tsv separato dalla scheda genererà il seguente errore:

ds12 <- read.table("21600-0012-Data.tsv", sep="\t", comment.char="", 
quote = "\"", header=TRUE) 

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, 
na.strings, : line 2390 did not have 1851 elements 

Sembra che ci sia un leggero problema di formattazione con alcuni file che fa sì che R rifiuti il ​​file. Almeno una parte del problema sembra essere l'uso occasionale di virgolette anziché di un apostrofo che causa un numero non uniforme di caratteri di virgoletta doppia in una riga.

Dopo giocherellare, ho individuato tre possibili soluzioni:.

  1. Aprire il file in un editor di testo e di ricerca/sostituire tutte le istanze di carattere preventivo "con niente In altre parole, eliminare tutte doppie citazioni. per questi dati delimitati da tabulazioni, questo significava solo che alcuni stralci letterali di commenti da parte di soggetti non erano più tra virgolette che era un non-problema per la mia analisi dei dati.

  2. Con i dati memorizzati su ICPSR (vedi link sopra) o altri archivi un'altra soluzione è scaricare i dati in un nuovo formato.Una buona opzione in questo caso è quello di scaricare la versione Stata del DS12 e poi aprirlo con il comando read.dta come segue:

    library(foreign) 
    ds12 <- read.dta("21600-0012-Data.dta") 
    
  3. A correlato soluzione/hack è di aprire il file in Excel .tsv e salvarlo nuovamente come file di testo separato da tabulazioni. Questo sembra ripulire qualsiasi problema di formattazione rende infelice R.

Nessuno di questi sono l'ideale in quanto non del tutto a risolvere il problema in R con file .tsv originale, ma i dati dispute spesso richiede l'utilizzo di più programmi e formati.

-1

Una delle mie variabili era categoriale con un'alternativa essendo multi stringa ("nessun evento"). Quando ho usato read.table, si presupponeva che lo spazio dopo la prima stringa significasse la fine del punto dati e che la seconda stringa fosse passata alla variabile successiva. Ho usato sep = "\ t" per risolvere il problema. Stavo usando RStudio in un ambiente Mac OX. Una soluzione precedente era trasformare i file .txt in .csv in Excel, e poi aprirli con la funzione read.csv. Elementi

+0

Votato verso il basso.Le estensioni sono irrilevanti a R. Puoi usare read.csv() se il file è chiamato qualcosa.txt o qualcosa.xls o qualcosa.csv, purché il file è ASCII. Nota anche read.csv() è uguale a read.table (sep = ',', header = TRUE). È solo una scorciatoia per quest'ultimo. –

1

Per gli altri che non riescono a trovare una soluzione e conoscere i dati non manca:

Ho questo problema quando uso di Excel 2013 per salvare i file come .csv e quindi provare a caricarli in R usando read.table(). La soluzione che ho trovato è quello di incollare i dati direttamente da Excel in un documento .txt, quindi aprire con:

read.table(file.choose(), sep="\t"). 

Spero che questo aiuta.

2

Se si utilizza linux e il file di dati proviene da Windows. Probabilmente perché il personaggio^M Trova ed elimina. fatto!

0

Ho riscontrato questo errore quando ho avuto un row.names = "id" (per lo tutorial) con una colonna denominata "id".

Problemi correlati