【发布时间】:2015-06-12 11:54:07
【问题描述】:
fread 有没有办法模仿read.table 的行为,其中变量的class 由读入的数据设置。
我在主要数据下方有几个 cmets 的数字数据。当我使用fread 读取数据时,这些列将转换为字符。但是,通过在 read.table 中设置nrow,我可以停止这种行为。这在 fread 中是否可能。 (我不希望更改原始数据或制作修改后的副本)。谢谢
一个例子
d <- data.frame(x=c(1:100, NA, NA, "fff"), y=c(1:100, NA,NA,NA))
write.csv(d, "test.csv", row.names=F)
in_d <- read.csv("test.csv", nrow=100, header=T)
in_dt <- data.table::fread("test.csv", nrow=100)
哪个产生
> str(in_d)
'data.frame': 100 obs. of 2 variables:
$ x: int 1 2 3 4 5 6 7 8 9 10 ...
$ y: int 1 2 3 4 5 6 7 8 9 10 ...
> str(in_dt)
Classes ‘data.table’ and 'data.frame': 100 obs. of 2 variables:
$ x: chr "1" "2" "3" "4" ...
$ y: int 1 2 3 4 5 6 7 8 9 10 ...
- attr(*, ".internal.selfref")=<externalptr>
作为一种解决方法,我认为我可以使用read.table 在一行中阅读,获取课程并设置colClasses,但我误解了。
cl <- read.csv("test.csv", nrow=1, header=T)
cols <- unname(sapply(cl, class))
in_dt <- data.table::fread("test.csv", nrow=100, colClasses=cols)
str(in_dt)
使用Windows8.1 R 版本 3.1.2 (2014-10-31) 平台:x86_64-w64-mingw32/x64(64位)
【问题讨论】:
-
听起来像是一个合理的计划,但我实际上阅读了帮助页面:“如果 colClasses 请求它,fread 只会将列提升为更高的类型。它不会将列降级为更低的类型,因为NAs 会导致。如果你真的需要数据丢失,你必须自己强制这些列。似乎即使将读取限制为 5 行也失败了。我想我记得 colClasses 机制是最近才添加的,所以也许你应该提交一个功能请求。马修和阿伦经常很随和。
-
肯定必须有一个 DT 策略来强制所有列为数字?将
.SDcols设置为适当的向量,如下所示:DT[, .SD := lapply(.SDcols, as.numeric), .SDcols=vec]。我不是 DT 用户,但我确信有某种最小输入方法,我怀疑你可以在 SO 答案中找到它的说明。 -
@BondedDust;我也不是 DT 用户,它只是 read.table 与我的数据相比 fread 存在(更严重的)问题。生病看看SO。谢谢
-
听着,别再反抗你的头衔了。这不是关于“使用 nrows”。将字符串写入整数列是故意写入有缺陷的 csv。您的问题是 “我可以防止 data.table 的 fread 列类推断被数据中的尾随字符串注释行覆盖吗?” 您知道注释行应该以评论字符(如
#)。当我们将其添加到您的评论文本中时,我们会使用read.csv(但不是fread)得到正确的行为。是的,fread可以进行增强。同时需要一种解决方法。 -
感谢您的意见。 .
"Writing out a string to an integer column is intentionally writing a defective csv."- 这是一个mwe以反映我拥有的一些数据,因此没有评论。如果我将#添加到文件中,它不会反映我拥有的数据。顺便说一句,我没有恢复。
标签: r data.table read.table