R package:data.table - version。 1.9.2
我有一个“;”我需要根据第一列中显示的日期进行子集化的分隔文本文件。我使用fread()只读取第一列,并返回所需日期的索引,因此我可以使用索引的min()跳转到,以及要读取的行数的length()。 (在这种情况下,我只需要连续2天 - 2880行/读数)
问题是header = TRUE似乎只捕获紧接在读取行之前的数据行并将其用作标题信息,而不是文本文件第一行中的实际标题。
我将它包装在一个函数中并计时,它似乎是一种相当快速的方法,可以对所需的过滤对RAM使用产生最小的影响。这个文件只有大约200万行,所以只读整个内容并进行子集化不会有问题,但我想要一个解决方案,当我的文本文件变大时。
findRows<-fread("power.txt", header = TRUE, select = 1)
all<-(which(findRows$Date %in% c("14/2/2008", "15/2/2008")) )
skipLines<- min(all)
keepRows<- length(all)
feb<- fread("power.txt", skip = skipLines , nrows = keepRows, header = TRUE)
rm(findRows)
head(feb)
14/2/2008 00:00:00 0.252 0.000 244.230 1.000 0.000 0.000 0.000
1: 14/2/2008 00:01:00 0.254 0 245.24 1 0 0 0
2: 14/2/2008 00:01:00 0.254 0 245.24 1 0 0 0
3: 14/2/2008 00:02:00 0.254 0 245.31 1 0 0 0
4: 14/2/2008 00:03:00 0.252 0 244.44 1 0 0 0
5: 14/2/2008 00:04:00 0.252 0 244.27 1 0 0 0
6: 14/2/2008 00:05:00 0.252 0 244.62 1 0 0 0
> system.time(loadF())
user system elapsed
0.55 0.01 0.56
我能够通过设置header = FALSE并将第一行读入另一个小数据集并提取所有列名称(因为我只是第一次读取第一列)并将这些名称设置为data.table但如果在fread()调用中有办法,这似乎不是最佳解决方案。
findRows<-fread("power.txt", header = TRUE, select = 1)
all<-(which(findRows$Date %in% c("14/2/2008", "15/2/2008")) )
skipLines<- min(all)
keepRows<- length(all)
feb<- fread("power.txt", skip = (skipLines) , nrows = keepRows, header = FALSE)
rm(findRows)
febNames<- names(fread("power.txt", nrow = 1))
setnames(feb, febNames)
head(feb)
Date Time Global_active_power Global_reactive_power Voltage
1: 14/2/2008 00:00:00 0.252 0 244.23
2: 14/2/2008 00:01:00 0.254 0 245.24
3: 14/2/2008 00:02:00 0.254 0 245.31
4: 14/2/2008 00:03:00 0.252 0 244.44
5: 14/2/2008 00:04:00 0.252 0 244.27
6: 14/2/2008 00:05:00 0.252 0 244.62
Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3
1: 1 0 0 0
2: 1 0 0 0
3: 1 0 0 0
4: 1 0 0 0
5: 1 0 0 0
6: 1 0 0 0
> system.time(loadF())
user system elapsed
0.61 0.05 0.66
有没有办法在fread()调用中跳转到行610,957并最初创建feb data.table而不必创建另一个data.table,长度为1只是为了读取头文件?