2011-01-30 10 views
15

ho un file in questo modo:Leggere un file di testo con numero variabile di colonne a una lista

mylist.txt 
234984 10354 41175 932711 426928 
1693237 13462 

Ogni riga di questo file ha un diverso numero di elementi, minimo di 1 elemento per riga. Vorrei leggerlo in una lista come questa:

> print(head(mylist,2)) 
[[1]] 
[1] 234984 10354 41175 932711 426928 

[[2]] 
[1] 1693237 13462 
+0

Dal le voci dell'elenco di esempio mostrano gli spazi preservati tra i numeri, non è chiaro se si desidera che ogni riga sia una stringa lunga o un vettore di numeri. –

+0

Vettore di numeri. Non sono sicuro del perché mostra spazi. Ad ogni modo, la risposta aL3xa sembra funzionare piuttosto bene. – pms

risposta

19

Partendo dal presupposto che lo spazio è delimitatore:

fc <- file("mylist.txt") 
mylist <- strsplit(readLines(fc), " ") 
close(fc) 

EDIT:

Se i valori sono delimitate da diversi spazi (una/o in modo unconsistent), è possibile abbinare delimitatore con l'espressione regolare:

mylist.txt 
234984 10354 41175 932711  426928 
1693237    13462 

fc <- file("mylist.txt") 
mylist <- strsplit(readLines(fc), " +") 
close(fc) 

EDIT # 2

E poiché strsplit restituisce stringhe, è necessario convertire i dati in numerico (che è un compito facile):

mylist <- lapply(mylist, as.numeric) 
2

Una possibile risposta è quello di leggere prima un elenco pieno di AN e quindi la loro rimozione in questo modo:

l<-as.list(as.data.frame(t(read.table("mylist.txt",fill=TRUE,col.names=1:max(count.fields("mylist.txt")))))) 
l<-lapply(l, function(x) x[!is.na(x)]) 

Mi chiedo se ci è un modo più semplice di farlo.

1

Si potrebbe semplificare la seconda linea utilizzando lapply invece di sapply

lapply(l, function(x)x[!is.na(x)]) 
+0

1. Ne hai bisogno, altrimenti read.table prende come numero di colonne per leggere il numero massimo di colonne nelle prime 5 righe del file. – pms

+0

@pms Ahh, il mio file di test aveva il numero massimo di colonne nella prima riga. Ho aggiornato la mia risposta. – csgillespie

+0

2. Hai ragione, l'ho modificato, grazie per le tue osservazioni. – pms

Problemi correlati