我有一个巨大的.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
.........................
.........................
任何帮助将不胜感激。先感谢您。
答案 0 :(得分:1)
查看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)
不可否认,这个软件包有时会感觉有点笨重,在某些情况下我必须找到小工具来获得我的结果(你可能需要根据你的数据调整我的解决方案)。不过,我发现它对于处理超出我RAM的文件来说是一个非常有用的解决方案。
答案 1 :(得分:1)
只是想知道这样做是否有效。它适用于我的代码,但是我不确定是先读取整个数据然后进行子集设置还是只读取文件的Variables == 'X'
部分。
temp <- fread('dat.csv')[Variables == 'X']
答案 2 :(得分:0)
我想说大多数时候你可能只是在整个文件中读取,然后在R中进行子集:
df <- read.csv(file="path/to/your/file.csv", header=TRUE)
df.x <- df[df$Variables=='x', ]
R完全在内存中运行,因此如果你的文件总大小太大而无法容纳在内存中,可能会出现我上面所说的例外情况,但出于某种原因,感兴趣的子集可以。