R:有没有一种方法可以在读取文件时将文件子集

R:有没有一种方法可以在读取文件时将文件子集,r,csv,R,Csv,我有一个巨大的.csv文件,它的大小约为1.4G,使用read.csv阅读需要时间。该文件中有几个变量,我只想提取某列中几个变量的数据 例如,假设ABC.csv是我的文件,它看起来像这样: ABC.csv Date Variables Val 2017-11-01 X 23 2017-11-01 A 2 2017-11-01 B 0.5 ..............

我有一个巨大的
.csv
文件,它的大小约为1.4G,使用
read.csv
阅读需要时间。该文件中有几个变量,我只想提取某列中几个变量的数据

例如,假设
ABC.csv
是我的文件,它看起来像这样:

   ABC.csv
     Date       Variables   Val
   2017-11-01   X           23  
   2017-11-01   A           2
   2017-11-01   B           0.5
   ............................
   2017-11-02   X           20
   2017-11-02   C           40
   ............................
   2017-11-03   D           33
   2017-11-03   X           22   
   ............................
   ............................
因此,这里感兴趣的变量是
X
,在读取此文件时,我希望扫描
df$Variables
,只读取此列中带有
X
字符串的行。因此,我的新数据将如下所示:

 > df 
  Date    Variables   Val
2017-11-01    X       23
2017-11-02    X       20
.........................
......................... 

任何帮助都将不胜感激。先谢谢你

我想说的是,大多数情况下,您可能只需读取整个文件,然后读取R中的子集:

df <- read.csv(file="path/to/your/file.csv", header=TRUE)
df.x <- df[df$Variables=='x', ]

df查看
LaF
包,它允许以块的形式读取非常大的文本文件,因此您不必将整个文件读入内存

library(LaF)

data_model <- detect_dm_csv("yourFile.csv", skip = 1) # detects the file structure
dat <- laf_open(data_model) # opens connection to the file

block_list <- lapply(seq(1,100000,1000), function(row_num){
    goto(dat, row_num)
    data_block <- next_block(dat, nrows = 1000) # reads data blocks of 1000 rows
    data_block <- data_block[data_block$Variables == "X",]
    return(data_block)
})
your_df <- do.call("rbind", block_list)
库(LaF)

数据模型只是想知道这样做是否有效。它适用于我的代码,但我不确定它是先读取整个数据,然后再进行子集设置,还是只读取文件中
Variables=='X'
的部分

temp <- fread('dat.csv')[Variables == 'X']

temp最好从
RevoScaleR
检查
rxImport
。它有选择行和列的选项您为什么不使用fread呢?请注意:谢谢@Akrun我会仔细考虑您的建议。1.4 GB很小。只要用fread和subset来读就行了。这应该很快就完成了。这就是我正在做的,但我想在读取大文件时节省时间。@ShretaGhimire然后
fread
似乎是个不错的选择。只写你真正想要的行。@shritaghimire,但我不确定你能节省多少实际时间。在任何情况下,您都需要扫描整个文件,即使在此过程中放弃了某些行。但是可以,您可以节省内存。这是
awk
解决方案更可取的地方。这是一个固定宽度的格式文件,我很确定
awk
可以对字符位置执行逻辑操作。