2010-06-10 16 views
11

Mam plik o nazwie genes.txt, który chciałbym stać się data.frame. Jest tam wiele linii, każda linia ma trzy, zakładka ograniczona pola:R: Dlaczego plik read.table przestaje czytać plik?

mike$ wc -l genes.txt 
    42476 genes.txt 

Chciałbym odczytać ten plik w data.frame w R. używam read.table polecenia, na przykład:

genes = read.table(
    genes_file, 
    sep="\t", 
    na.strings="-", 
    fill=TRUE, 
    col.names=c("GeneSymbol","synonyms","description") 
) 

który wydaje się działać dobrze, gdzie genes_file wskazuje na genes.txt. Jednak liczba linii w moim data.frame jest znacznie mniejsza niż liczba wierszy w moim pliku tekstowego:

> nrow(genes) 
[1] 27896 

i rzeczy mogę znaleźć w pliku tekstowego:

mike$ grep "SELL" genes.txt 
SELL CD62L|LAM1|LECAM1|LEU8|LNHR|LSEL|LYAM1|PLNHR|TQ1 selectin L 

don” t wydają się być w data.frame

> grep("SELL",genes$GeneSymbol) 
integer(0) 

okazuje się, że

genes = read.delim(
    genes_file, 
    header=FALSE, 
    na.strings="-", 
    fill=TRUE, 
    col.names=c("GeneSymbol","synonyms","description"), 
) 

działa dobrze. Dlaczego read.delim działa, gdy read.table nie?

Jeśli to użycia, można odtworzyć genes.txt stosując następujące polecenia, które należy uruchomić z wiersza poleceń

curl -O ftp://ftp.ncbi.nlm.nih.gov/gene/DATA/gene_info.gz 
gzip -cd gene_info.gz | awk -Ft '$1==9606{print $3 "\t" $5 "\t" $9}' > genes.txt 

ostrzegam jednak, że gene_info.gz jest 101MBish.

+0

Czy jest przypadkiem coś specjalnego w linii 27897, które może przerwać import? Nie mogę teraz pobrać pliku, spróbuję później, jeśli jeszcze nie otrzymałeś odpowiedzi. – nico

+0

Nie, nie mogę zobaczyć! Okazuje się, że read.delim działa dobrze, więc jest to nieco mniej irytujące niż było. Bardzo mocno zredagowałem to pytanie (przepraszam 11 osób, które przeczytały go w ciągu pierwszych 4 minut od jego wydania), aby ponownie sformułować pytanie, dlaczego read.delim działa, gdy read.table nie działa? –

+2

Nie patrzyłem na plik, ale cytowanie i komentarze są dwoma popularnymi sposobami na przełamanie rzeczy. Na przykład read.table traktuje znak "#" jako znak komentarza, który jest nieodpowiedni dla wielu plików. –

Odpowiedz

15

Z read.table jednym z domyślnych znaków cudzysłowu jest pojedynczy cytat. Zgaduję, że masz kilka niedopasowanych pojedynczych cudzysłowów w polu opisu, a wszystkie dane między pojedynczymi cudzysłowami łączą się w jeden wpis.

Z read.delim znak cudzysłowu jest podwójną kwotą i nie stanowi to problemu.

Podaj swój znak zapytania i powinieneś już wszystko ustawić.

> genes<-read.table("genes.txt",sep="\t",quote="\"",na.strings="-",fill=TRUE, col.names=c("GeneSymbol","synonyms","description")) 
> nrow(genes) 
[1] 42476 
+0

dzięki! Spodziewam się, że powinienem był zauważyć, że moje ostatnie zgłoszenie było ogromne! Radości z nauki ... –

+0

Dołącz do Kościoła Krzywej Uczenia się. :) –

+0

Inną opcją (której użyłem) jest ustawienie quote = "" i po prostu usunięcie cudzysłowów. Zauważ, że prawdopodobieństwo wystąpienia tego problemu będzie * po cichu *, jeśli użyjesz pola fill = TRUE. –