fread中的特定行

时间:2016-03-07 15:05:06

标签: r

我试图只读取几个csv文件中的特定行。每个文件有20000行。但是,我只想选择行350-850,1350-1850,2300-2850等,直到19350-19850(因此* 350- * 850范围内的任何值)。

创建具有适当数字的向量似乎不可能:

Error in FUN(X[[i]], ...) : 
'nrows' must be a single non-NA number of type numeric or integer

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

这不使用fread,而是在一次通过中将文件读入SQLite数据库,然后只将所需的行发送到R而没有其他行。

它将首先将文件读入它为动态创建的SQLite数据库,并且不经过R就这样做,因此R限制不适用于该步骤。然后它只会读入R指示的行,这样只要选择的行(与整个文件相对)可以适合R,你应该没问题。最后,数据库会自动销毁。

下面,根据文件的不同,您可能需要read.csv.sql的其他参数,例如headersep。请参阅?read.csv.sql?sqldf,并注意相对于read.table参数的可用参数存在差异。

library(sqldf)

from <- seq(350, 19350, 1000)
where <- paste( sprintf("(rowid between %d and %d)", from, from+500), collapse = " or ")

fn$read.csv.sql("myfile.csv", sql = "select * from file where $where")

注1:您可以像这样检查sql语句:

sql <- fn$identity("select * from file where $where") # sql holds text of SQL command
read.csv.sql("myfile.csv", sql = sql)

注2:以下是一个自包含的示例:

library(sqldf)

# write test file
write.table(data.frame(a = 1:20000), "myfile.csv", row.names = FALSE)

from <- seq(350, 19350, 1000)
where <- paste( sprintf("(rowid between %d and %d)", from, from+500), collapse = " or ")
DF <- fn$read.csv.sql("myfile.csv", sql = "select * from file where $where")