从特定行读取 csv
Posted
技术标签:
【中文标题】从特定行读取 csv【英文标题】:Read csv from specific row 【发布时间】:2011-07-06 06:08:15 【问题描述】:我在 csv 文件中有从 1980 年开始的每日数据。但是我只想读取 1985 年的数据。因为另一个文件中的另一个数据集是从 1985 年开始的。在 R 语言中如何跳过读取 1985 年之前的数据?
【问题讨论】:
【参考方案1】:我想你想看看?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),]
【讨论】:
【参考方案2】:这里有一些选择。 (您可能希望之后将第一列转换为"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 + 子集
# 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"')
【讨论】:
如何将多个参数传递给日期?即,如果您想返回 Date = "2007-01-01" OR "2007-01-02" 的所有行。subset(DF2, Date == "2007-01-01" | Date == "2007-01-02")
where Date = "2007-01-01" or Date = "2007-01-02"
@G.Grothendieck 我在 Mac 上工作。我有 ASCII 文件。我将它们读入一个名为fl1
的表中,因为我还无法加载光栅 pkg。它在 sql 语句中的file
处引发错误。代码是specific rows <- read.csv.sql(fl1, sql = 'select * from file where V1 IN (101, 201, 301)
【参考方案3】:
data.table
方法将提供速度和内存性能:
library(data.table)
fread(file, skip = 1825)
【讨论】:
以上是关于从特定行读取 csv的主要内容,如果未能解决你的问题,请参考以下文章