2011-01-30 10 views
15

Mam plik tak:odczytać plik tekstowy o zmiennej liczbie kolumn do listy

mylist.txt 
234984 10354 41175 932711 426928 
1693237 13462 

Każda linia tego pliku ma różną liczbę elementów, minimum 1 elementu w wierszu. Chciałbym ją przeczytać w liście, jak to:

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

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

Rejestracja Twoje przykładowe elementy listy pokazują spacje zachowane między liczbami, nie jest jasne, czy chcesz, aby każda linia była długim ciągiem, czy też liczbą liczb. –

+0

Wektor liczb. Nie wiem, dlaczego pokazuje spacje. Tak czy inaczej, odpowiedź aL3xa wydaje się działać całkiem dobrze. – pms

Odpowiedz

19

Zakładając, że przestrzeń jest separator:

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

EDIT:

Jeżeli wartości są ograniczone przez kilka pomieszczeń (AN/lub w unconsistent sposób), można dopasować separator z wyrażenia regularnego:

mylist.txt 
234984 10354 41175 932711  426928 
1693237    13462 

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

EDIT # 2

I od strsplit zwraca struny, trzeba konwertować dane numeryczne (to łatwe):

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

Możliwym rozwiązaniem jest najpierw przeczytać listę wypełnioną NAS i następnie usuwając je tak:

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)]) 

Zastanawiam się, czy istnieje jest prostszym sposobem robienia tego.

1

Można by uprościć drugą linię za pomocą lapply zamiast sapply

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

1. Potrzebujesz go, w przeciwnym razie read.table przyjmuje jako liczbę kolumn, aby odczytać maksymalną liczbę kolumn w pierwszych 5 wierszach pliku – pms

+0

@pms Ahh, mój plik testowy miał maksymalną liczbę kolumn w pierwszym wierszu. Zaktualizowałem swoją odpowiedź. – csgillespie

+0

2. Masz rację, zredagowałem to, dziękuję za uwagi. – pms

Powiązane problemy