2013-04-12 3 views
10

У меня есть файл CSV, который я прочитал, используя следующую функцию:пропустить некоторые строки в read.csv в R

csvData <- read.csv(file="pf.csv", colClasses=c(NA, NA,"NULL",NA,"NULL",NA,"NULL","NULL","NULL")) 
dimnames(csvData)[[2]]<- c("portfolio", "date", "ticker", "quantity") 

Он читает все строки из этого файла. Но я хочу пропустить некоторые строки из чтения. Строка не должна считываться, если значение ticker -column: ABT или ADCT. Является ли это возможным?

образец моего файла CSV выглядит следующим образом:

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

Использование 'readLines' и использовать регулярные выражения для фильтрации нежелательных строк. –

+1

Почему бы не прочитать во всем файле и подмножестве позже? – A5C1D2H2I1M1N2O1R2T1

+0

Фактически файл с 200mb + и большинство данных содержит эти значения. –

ответ

18

Это возможно с помощью sqldf package, используя read.csv.sql

Допустим, содержимое sample.csv выглядит следующим образом:

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

Теперь читать только те строки, где возраст = 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 

Можно выбрать необходимые столбцы:

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

Можете ли вы уточнить ответ? Тогда это будет более вероятно, чтобы помочь вашему ответу привлечь внимание. –

+0

Я обновил свой ответ простым, самодостаточным примером. – Nishanth

+2

+1 для подробного ответа;) –

1

Лучше прочитать все и подмножество позже, как предложено в комментарии:

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

EDIT

Вы может использовать fread от data.table пакет для более эффективного способа чтения вашего файла.

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

Предполагая, что файл был слишком велик для чтения в память, что тогда было бы выбором OP? –

+2

Фактически файл с 200mb + и большинство данных содержит эти значения. Так что я думаю, что это не эффективно. –

0

Для меня read.csv.sql пакета sqldf отлично смотрится при первом румянце. Но когда я попытался использовать его, он не справился со строками «NULL». (Другие тоже это выяснили.) К сожалению, он не поддерживает все функции read.csv. Так что я должен был написать свой собственный. Я удивлен, что для этого нет хорошего пакета.

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' основан на средствах SQLite, а не на' read.table', поэтому нельзя ожидать, что он будет работать точно так же; однако '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' могут использоваться для произвольной предварительной обработки, поэтому в зависимости от того, что ваши данные выглядят как произвольные ситуации с отсутствующим значением, обычно можно обрабатывать.Например, 'filter =" sed -e s/NULL // g "' удалит все вхождения строки NULL. (В Windows предполагается, что у вас установлен Rtools и получить от него команду.) –

+0

Я попытался заменить NULL пустым строком, но не был интерпретирован как NA. Ваш трюк AFAIK не заставил бы его рассматривать значения как NA. – Chris

+0

Если это числовое поле, скажем, тогда они будут обрабатываться как 0, и вы можете заменить их на конец R. Или замените NULL на -99, скажем, и замените их на конце R. –

Смежные вопросы