在R中使用fread中的skip参数时丢失标题名称

时间:2014-05-08 21:42:01

标签: r fread

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只是为了读取头文件?

0 个答案:

没有答案