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
可以对字符位置执行逻辑操作。