R 使用 fread colClasses 或跳过参数来读取没有列标题的 csv

Posted

技术标签:

【中文标题】R 使用 fread colClasses 或跳过参数来读取没有列标题的 csv【英文标题】:R using fread colClasses or skip arguments to read csv with no column headers 【发布时间】:2013-07-08 04:08:00 【问题描述】:

我希望能够跳过通过 v1.8.9 中的 data.tablefread 函数读入 R 的列。但是我正在阅读的 csv 没有列标题……这似乎是 fread 的一个问题……有没有办法指定我不想要特定的列?

预先分配一个列名然后让它读入以便可以跳过它会更好吗?

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

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

解压...

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

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> 

我尝试使用新的(ish)colClasses 或跳过参数来忽略第一列都是相同的事实......并且是不必要的。

但是做:

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) skip 参数是关于跳过行而不是列;我不相信如果有 col.skip 参数,你会得到明显的速度提升 - 在决定放弃它们之前你仍然需要阅读这些字符 @SanderVanderZeeuw 我试过你的方法...但得到以下错误:pp &lt;- fread("AUDUSD-2013-05.csv",sep=",", colClasses=c(NULL,"character","numeric","numeric"))Error in fread("AUDUSD-2013-05.csv", sep = ",", colClasses = c(NULL, "character", : colClasses is unnamed and length 3 but there are 4 columns. See ?data.table for more info about the colClasses argument. @h.l.m 你必须尝试 colClasses=NULL 而不是别的。 R 通常知道如何处理某些列。还有 1 个问题,您不需要整个 CSV 文件,因此只需要最后 3 列? 是的,我只想要最后三列...... 【参考方案1】:

我认为您要查找的参数是drop。试试:

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

请注意,您可以通过姓名或职位drop

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

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

您也可以按姓名或职位select

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 中。您需要升级才能使用它们。

【讨论】:

以上是关于R 使用 fread colClasses 或跳过参数来读取没有列标题的 csv的主要内容,如果未能解决你的问题,请参考以下文章

fread - 跳过以特定字符开头的行 - “#”

合并或跳过核心数据模型的版本

SQL*Plus 禁用或跳过 ACCEPT PROMPT

R read.xlsx colClasses 问题

调试或跳过顺序 pytorch 模型的最佳方法

如何删除或跳过字符串中的多个新行?