在R中读取时进行子设定

时间:2014-05-08 09:02:56

标签: r date file-io subset

我在R中有500多万行,每行只有4列。其中一列是收集数据的日期。一个例子是

Date        PI   SSC    GC
2/11/2013 0.52  0.89   4.2
2/11/2013 0.56  0.45  12.0
2/11/2013 0.49  0.89  13.1
2/11/2013 0.59  0.47   4.8 
2/11/2013 0.61  0.58  12.3

我想知道是否有办法只读取某些日期对应的某些行,而不是必须读取500万行然后进行子集化。例如,对应于日期2/11/2013的所有行(我不知道文件中有多少行)。此外,如果有任何帮助,Date列的类是factor。

1 个答案:

答案 0 :(得分:2)

虽然不完全是用户要求的答案,但5 mil行并不是真的太难阅读。当然基数R read.table将非常慢,但使用fread包中的data.table速度已经足够快了。以下是基准

tbl <- read.table(header=T, stringsAsFactors=F, text='Date        PI   SSC    GC
2/11/2013 0.52  0.89   4.2')

require(data.table)
#create hige datatable with 5mil rows to write to temp file
bigtbl <- rbindlist( lapply(1:(5*1e6), function(x) tbl))
write.table(bigtbl, row.names=F, quote=F, file="temp.txt")


#benchmark of reading 5 mil row file back using fread function
system.time(bigtbl2 <- fread('temp.txt'))

## Read 5000000 rows and 4 (of 4) columns from 0.116 GB file in 00:00:11
##  user  system elapsed 
##  10.76    0.08   10.86 

当然内存大小可能仍然值得关注,但在这种情况下它仍然只有153MB

> tables()
     NAME         NROW  MB COLS           KEY
[1,] bigtbl2 5,000,000 153 Date,PI,SSC,GC    
Total: 153MB

如果您要经常阅读此数据,使用save函数将数据保存在标准RData文件中并使用load

读取它是有意义的