Читать CSV из конкретной строки - PullRequest
17 голосов
/ 06 июля 2011

У меня есть ежедневные данные начиная с 1980 года в CSV-файле. Но я хочу читать данные только с 1985 года. Поскольку другой набор данных в другом файле начинается с 1985 года. Как я могу пропустить чтение данных до 1985 года на языке R?

Ответы [ 3 ]

29 голосов
/ 06 июля 2011

Я думаю, вы хотите взглянуть на ?read.csv, чтобы увидеть все варианты.

Немного сложно дать точный ответ, не увидев образец ваших данных.

Если ваши данные не имеют заголовка, и вы знаете, с какой строки начинаются данные 1985 года, вы можете просто использовать что-то вроде ...

impordata <- read.csv(file,skip=1825)

... чтобы пропустить первые 1825 строк.

В противном случае вы всегда можете просто установить подмножество данных после их импорта, если в ваших данных есть переменная года.

impordata <- read.csv("skiplines.csv")
impordata <- subset(impordata,year>=1985)

Если вы не знаете, где начинаются данные за 1985 год, вы можете использовать grep, чтобы найти первый экземпляр 1985 года в переменной даты вашего файла, а затем сохранить только эту строку и далее:

impordata <- read.csv("skiplines.csv")
impordata <- impordata[min(grep(1985,impordata$date)):nrow(impordata),]
19 голосов
/ 06 июля 2011

Вот несколько альтернатив. (Вы можете захотеть преобразовать первый столбец в класс "Date" впоследствии и, возможно, преобразовать все это в объект зоопарка или другой объект класса временных рядов.)

# create test data
fn <- tempfile()
dd <- seq(as.Date("1980-01-01"), as.Date("1989-12-31"), by = "day")
DF <- data.frame(Date = dd, Value = seq_along(dd))
write.table(DF, file = fn, row.names = FALSE)

read.table + subset

# if file is small enough to fit in memory try this:

DF2 <- read.table(fn, header = TRUE, as.is = TRUE)
DF2 <- subset(DF2, Date >= "1985-01-01")

read.zoo

# or this which produces a zoo object and also automatically converts the 
# Date column to Date class.  Note that all columns other than the Date column
# should be numeric for it to be representable as a zoo object.
library(zoo)
z <- read.zoo(fn, header = TRUE)
zw <- window(z, start = "1985-01-01")

Если ваши данные не в том же формате, что и в примере, вам нужно будет использовать дополнительные аргументы для read.zoo.

несколько таблиц read.table

# if the data is very large read 1st row (DF.row1) and 1st column (DF.Date)
# and use those to set col.names= and skip=

DF.row1 <- read.table(fn, header = TRUE, nrow = 1)
nc <- ncol(DF.row1)
DF.Date <- read.table(fn, header = TRUE, as.is = TRUE, 
   colClasses = c(NA, rep("NULL", nc - 1)))
n1985 <- which.max(DF.Date$Date >= "1985-01-01")

DF3 <- read.table(fn, col.names = names(DF.row1), skip = n1985, as.is = TRUE)

sqldf

# this is probably the easiest if data set is large.

library(sqldf)
DF4 <- read.csv.sql(fn, sql = 'select * from file where Date >= "1985-01-01"')
0 голосов
/ 09 января 2019

A data.table метод, который предложит скорость и производительность памяти:

library(data.table)
fread(file, skip = 1825)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...