使用fread的colClasses或skip参数读取没有列标题的csv文件。

11

我想通过 data.tablefread 函数在 R 中读取一列数据,但是我需要跳过其中某些列。然而,我正在读取的 csv 文件没有列标题...这似乎对 fread 造成了问题...是否有一种方式只指定我不想要的特定列呢?

还是直接预先分配一个列名然后让它读入,以便可以跳过它呢?

举个例子,我从以下网址下载数据

http://www.truefx.com/dev/data/2013/MAY-2013/AUDUSD-2013-05.zip

解压缩文件...

然后使用 fread 将 csv 文件读入 R 中,它几乎具有相同的文件名,只是扩展名不同。

system.time(pp <- fread("AUDUSD-2013-05.csv",sep=","))
  user  system elapsed 
16.427   0.257  16.682 

head(pp)
       V1                    V2      V3      V4
1: AUD/USD 20130501 00:00:04.728 1.03693 1.03721
2: AUD/USD 20130501 00:00:21.540 1.03695 1.03721
3: AUD/USD 20130501 00:00:33.789 1.03694 1.03721
4: AUD/USD 20130501 00:00:37.499 1.03692 1.03724
5: AUD/USD 20130501 00:00:37.524 1.03697 1.03719
6: AUD/USD 20130501 00:00:39.789 1.03697 1.03717

str(pp)
Classes ‘data.table’ and 'data.frame':  4060762 obs. of  4 variables:
$ V1: chr  "AUD/USD" "AUD/USD" "AUD/USD" "AUD/USD" ...
$ V2: chr  "20130501 00:00:04.728" "20130501 00:00:21.540" "20130501 00:00:33.789" "20130501 00:00:37.499" ...
$ V3: num  1.04 1.04 1.04 1.04 1.04 ...
$ V4: num  1.04 1.04 1.04 1.04 1.04 ...
- attr(*, ".internal.selfref")=<externalptr> 
我尝试使用新的colClasses或skip参数来忽略第一列是完全相同且不必要的事实,但执行以下代码:

`

我尝试使用新的colClasses或skip参数来忽略第一列是完全相同且不必要的事实,但执行以下代码:

`

pp1 <- fread("AUDUSD-2013-05.csv",sep=",",skip=1)

不要遗漏第一列的读取

使用colClasses会导致以下错误

pp1 <- fread("AUDUSD-2013-05.csv",sep=",",colClasses=list(NULL,"character","numeric","numeric"))

Error in fread("AUDUSD-2013-05.csv", sep = ",", colClasses = list(NULL,  : 
 colClasses is type list but has no names

其他尝试包括

pp1 <- fread("AUDUSD-2013-06.csv",sep=",", colClasses=c(V1=NULL,V2="character",V3="numeric",V4="numeric"))
str(pp1)
Classes ‘data.table’ and 'data.frame':  5524877 obs. of  4 variables:
 $ V1: chr  "AUD/USD" "AUD/USD" "AUD/USD" "AUD/USD" ...
 $ V2: chr  "20130603 00:00:00.290" "20130603 00:00:00.291" "20130603 00:00:00.292" "20130603 00:00:03.014" ...
 $ V3: num  0.962 0.962 0.962 0.962 0.962 ...
 $ V4: num  0.962 0.962 0.962 0.962 0.962 ...
 - attr(*, ".internal.selfref")=<externalptr>

换句话说,结果几乎与我未使用colClasses时完全相同...

有没有建议能够通过省略第一列来加快读取数据的速度?

还有或许有些过分要求,但是否可能直接读取zip文件而不是先解压缩再读取csv文件?

哦,如果不清楚的话,我正在使用data.table v1.8.9。


R通常会创建自己的列名,就像你上面有的V1、V2等。所以如果你能像上面那样读取数据,我不确定问题是什么?你可以尝试做colClasses = NULL而不声明它是一个列表。另外,你可以填写colClasses = c(col1,col2,col3,col4,col5) - Sander Van der Zeeuw
skip 参数是关于跳过行而不是列的;如果有一个 col.skip 参数,我并不认为你会得到明显的速度提升 - 在决定放弃它们之前,你仍然需要读取这些字符。 - eddi
@SanderVanderZeeuw 我尝试了你的方法...但是出现了以下错误:pp <- fread("AUDUSD-2013-05.csv",sep=",", colClasses=c(NULL,"character","numeric","numeric"))错误:fread("AUDUSD-2013-05.csv", sep = ",", colClasses = c(NULL, "character", : colClasses 没有命名并且长度为3,但有4列。有关 colClasses 参数的更多信息,请参见 ?data.table。 - h.l.m
@h.l.m 你可以尝试使用colClasses=NULL,其他的不需要。R通常知道如何处理特定的列。还有一个问题,你只需要CSV文件的最后3列,而不是整个文件吗? - Sander Van der Zeeuw
是的,我只需要最后三列... - h.l.m
显示剩余3条评论
1个回答

17

我认为你要找的参数是drop。请尝试:

require(data.table)  # 1.9.2+
pp <- fread("AUDUSD-2013-05.csv", drop = 1)

请注意您可以按名称或位置进行删除操作。

fread("AUDUSD-2013-05.csv", drop = c("columThree","anotherColumnName"))

fread("AUDUSD-2013-05.csv", drop = 10:15)  # read all columns other than 10:15

而且你也可以通过名称或位置进行选择

fread("AUDUSD-2013-05.csv", select = 10:15)  # read only columns 10:15

fread("AUDUSD-2013-05.csv", select = c("columnA","columnName2"))

这些参数添加在v1.9.2版本中(于2014年2月发布到CRAN),并在?fread中有文档记录。您需要升级才能使用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接