Пропустите некоторые строки в read.csv в R
У меня есть файл csv, который я читаю, используя следующую функцию:
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
Ответы
Ответ 1
Можно использовать sqldf package, используя read.csv.sql
Допустим, что содержимое sample.csv
выглядит следующим образом:
id,name,age
1,"a",23
2,"b",24
3,"c",23
Теперь, чтобы читать только строки, где age = 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"
Ответ 2
Лучше прочитать все и подмножество позже, как это было предложено в комментарии:
csvData [!csvData$ticker %in% c('ADCT','ABT'),]
ИЗМЕНИТЬ
Вы можете использовать пакет fread
из data.table
для более эффективного способа чтения вашего файла.
library(read.table)
fread(file="pf.csv")
Ответ 3
Для меня пакет sqldf read.csv.sql выглядел великолепно с первого раза. Но когда я попытался использовать его, он не справился со строками "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: "аргумент 'object' должен отделить от одной символьной строки"