2011-07-06 54 views
17

Tôi có dữ liệu hàng ngày bắt đầu từ năm 1980 trong tệp csv. Nhưng tôi muốn đọc dữ liệu chỉ từ năm 1985. Bởi vì tập dữ liệu khác trong một tệp khác bắt đầu từ năm 1985. Làm thế nào tôi có thể bỏ qua đọc dữ liệu trước năm 1985 bằng ngôn ngữ R?Đọc csv từ hàng cụ thể

Trả lời

26

Tôi nghĩ bạn muốn xem ?read.csv để xem tất cả các tùy chọn.

Hơi khó để đưa ra câu trả lời chính xác mà không cần xem mẫu dữ liệu của bạn.

Nếu dữ liệu của bạn không có một tiêu đề và bạn biết rằng những dòng dữ liệu năm 1985 bắt đầu từ ngày, bạn chỉ có thể sử dụng một cái gì đó giống như ...

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

... bỏ qua 1825 dòng đầu tiên.

Nếu không, bạn luôn có thể chỉ đặt dữ liệu sau khi đã nhập nếu bạn có biến năm trong dữ liệu của mình.

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

Nếu bạn không biết nơi dữ liệu năm 1985 bắt đầu, bạn có thể sử dụng grep để tìm trường hợp đầu tiên năm 1985 trong biến ngày của tập tin của bạn và sau đó chỉ giữ từ dòng đó trở đi:

impordata <- read.csv("skiplines.csv") 
impordata <- impordata[min(grep(1985,impordata$date)):nrow(impordata),] 
17

Dưới đây là một vài lựa chọn thay thế. (Bạn có thể muốn chuyển đổi cột đầu tiên "Date" lớp sau đó và có thể chuyển đổi toàn bộ điều đến một đối tượng sở thú hoặc đối tượng chuỗi thời gian lớp khác.)

# 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 + tập hợp con

# 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") 

Nếu dữ liệu của bạn không nằm trong s định dạng ame làm ví dụ bạn sẽ cần sử dụng các đối số bổ sung cho read.zoo.

nhiều read.table của

# 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

Làm thế nào bạn sẽ vượt qua nhiều đối số cho Ngày? Tức là, nếu bạn muốn trả về tất cả các hàng trong đó Date = "2007-01-01" OR "2007-01-02". – Zach

+1

'tập con (DF2, Ngày ==" 2007-01-01 "| Ngày ==" 2007-01-02 ")' –

+0

Xin lỗi tôi là một phần của hàm read.csv.sql – Zach

Các vấn đề liên quan