从特定行读取 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 &lt;- 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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 fread 函数读取 CSV 文件的特定行

如何从特定行号读取csv文件到提供的行号? [关闭]

是否可以使用 read_csv 仅读取特定行?

逐列读取 CSV 文件

如何使用bash脚本从csv文件中读取特定的整数?

将特定行的csv读入php