2013-04-12 31 views
10

yılında read.csv bazı satırların atlayın. Ama bazı satırları okumaktan atlamak istiyorum. Satır ticker-kolonunun değeri: ABT veya ADCT ise okunmamalıdır. Mümkün mü? aşağıdaki gibi benim csv dosyasınınBen aşağıdaki işlevi kullanılarak okunan bir csv dosyası var R

örnektir:

RUS1000,01/29/1999,21st Centy Ins Group,TW.Z,90130N10,72096,1527.534,0.01,21.188 
RUS1000,01/29/1999,3com Corp,COMS,88553510,358764,16861.908,0.16,47.000 
RUS1000,01/29/1999,3m Co,MMM,88579Y10,401346,31154.482,0.29,77.625 
RUS1000,01/29/1999,A D C Telecommunicat,ADCT,00088630,135114,5379.226,0.05,39.813 
RUS1000,01/29/1999,Abbott Labs,ABT,00282410,1517621,70474.523,0.66,46.438 
RUS1000,02/26/1999,21st Centy Ins Group,TW.Z,90130N10,72096,1378.836,0.01,19.125 
RUS1000,02/26/1999,3com Corp,COMS,88553510,358764,11278.644,0.11,31.438 
RUS1000,02/26/1999,3m Co,MMM,88579Y10,402146,29783.938,0.29,74.063 
+3

kullanımı 'readLines' ve istenmeyen satırları filtrelemek için normal ifadeleri kullanılır. –

+1

Neden tüm dosyada okumuyorsunuz ve daha sonra altsetmiyorsunuz? – A5C1D2H2I1M1N2O1R2T1

+0

aslında 200mb + 'ya sahip olan ve büyük çoğunluğu bu değerleri içeren dosyadır. –

cevap

18

O

read.csv.sqlsample.csv içeriği aşağıdaki gibi göründüğünü Lets kullanarak, sqldf package kullanarak mümkündür: satırları okumak Şimdi

id,name,age 
1,"a",23 
2,"b",24 
3,"c",23 

nereye yaş = 23:

require(sqldf) 

df <- read.csv.sql("sample.csv", "select * from file where age=23") 

df 
    id name age 
1 1 "a" 23 
2 3 "c" 23 

Gerekli sütunları seçmek mümkündür:

df <- read.csv.sql("sample.csv", "select id, name from file where age=23") 
df 
    id name 
1 1 "a" 
2 3 "c" 
+1

Cevabı detaylandırabilir misiniz? Ardından cevabınızın dikkat çekmesine yardımcı olma olasılığı daha yüksek olacaktır. –

+0

Cevabımı basit, kendi kendine yeten bir örnekle güncelledim. Ayrıntılı yanıt için – Nishanth

+2

+1;) –

1

açıklamada önerilen gibi Daha sonra tüm ve alt kümeyi okumak daha iyidir:

csvData [!csvData$ticker %in% c('ADCT','ABT'),] 

DÜZENLEME

Sen Dosyanızı okumak için daha verimli bir yöntem için fread'u data.table paketinden kullanabilirsiniz.

library(read.table) 
fread(file="pf.csv") 
+4

Dosyanın hafızayı okumak için çok büyük olduğunu varsayarsak, OP'nin seçimleri ne olur? –

+2

aslında dosya 200MB + ve veri çoğunluğu bu değerleri içerir. Ben verimli olmadığını düşünüyorum. –

0

Benim için sqldf paketinin read.csv.sql ilk kızarmasında harika görünüyordu. Ama kullanmaya çalıştığımda, "NULL" dizeleriyle başa çıkamadı. (Diğerleri de bunu bulmuştur.) Ne yazık ki, tüm read.csv özelliklerini desteklemiyor. Bu yüzden kendi yazmam gerekiyordu. Bunun için iyi bir paket olmadığına şaşıyorum.

fetchLines=function(inputFile,match,fixed=T,n=100,maxlines=100000){ #inputFile='simple.csv'; match='APPLE'; 
    message('reading:',inputFile) 
    n=min(n,maxlines) 
    con <- base::file(inputFile, open = "r",encoding = "UTF-8-BOM") 
    data=c(readLines(con, n = 1, warn = FALSE)) 
    while (length(oneLine <- readLines(con, n = n, warn = FALSE)) > 0) { 
    grab=grep(match,oneLine,value=T,fixed=fixed) 
    if(length(grab)>0){ 
     data=c(data,grab) 
     if(length(data)>maxlines){ 
     warning("bailing out too many"); 
     return(data); 
     } 
     cat('.') 
    } 
    } 
    close(con) 
    gc() 
    cat("\n") 
    data; 
} 

#To avoid: argument 'object' must deparse to a single character string 
fdata=textConnection(fetchLines("datafile.csv",'\\bP58\\b',fixed=F,maxlines = 100000)) 
df<-read.csv(fdata,header=T,sep=",",na.strings = c('NULL',''),fileEncoding = "UTF-8-BOM",stringsAsFactors = F) 

R textConnection: "argument 'object' must deparse to a single character string"

+0

'read.csv.sql',' read.table' üzerinde değil, SQLite tesislerine dayanmaktadır, bu yüzden tam olarak aynı şekilde çalışmasını bekleyemez; Ancak, read.csv.sql'nin 'filter =' ve 'sql =' argümanları keyfi ön işleme için kullanılabilir; böylece verilerinizin nasıl göründüğüne bağlı olarak, eksik değer durumları genellikle ele alınabilir.Örneğin, 'filter =" sed -e s/NULL // g "' NULL dizesinin tüm oluşumlarını kaldırır. (Windows üzerinde, Rtools'un kurulu olduğunu ve oradan sed geleceğini varsayacaksınız.) –

+0

Boş dizelerle NULL'leri değiştirmeyi denedim, ancak NA olarak yorumlanmadı. Sizin hile AFAIK, değerleri NA olarak ele almazdı. – Chris

+0

Sayısal bir alan varsa, o zaman onlar 0 olarak kabul edilecek ve bunları R ucunda değiştirebilirsiniz. Ya da NULL'u -99 ile değiştirin, söyle ve bunları R ucunda değiştirin. –

İlgili konular