防止fread()中的列类推断

use*_*945 14 r read.table data.table

有没有一种方式,fread模仿的行为read.table,由此class变量是由在读取的数据集.

我有数据,主要数据下面有一些注释.当我fread用来读入数据时,列将转换为字符.但是,通过设置nrowread.table`我可以阻止此行为.这有可能在恐惧中.(我宁愿不改变原始数据或修改副本).谢谢

一个例子

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)
Run Code Online (Sandbox Code Playgroud)

哪个产生

> 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>
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,我认为我可以使用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)
Run Code Online (Sandbox Code Playgroud)

使用Windows8.1 R版本3.1.2(2014-10-31)平台:x86_64-w64-mingw32/x64(64位)

Ric*_*ven 18

选项1:使用系统命令

fread()允许在其第一个参数中使用系统命令.我们可以使用它来删除文件第一列中的引号.

indt <- data.table::fread("cat test.csv | tr -d '\"'", nrows = 100)
str(indt)
# Classes ‘data.table’ and '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 ...
#  - attr(*, ".internal.selfref")=<externalptr> 
Run Code Online (Sandbox Code Playgroud)

系统命令 cat test.csv | tr -d '\"' 解释:

  • cat test.csv 将文件读取到标准输出
  • | 是一个管道,使用上一个命令的输出作为下一个命令的输入
  • tr -d '\"'从当前输入中删除(-d)所有出现的双引号('\"')

选项2:阅读后的强制

由于选项1似乎不适用于您的系统,另一种可能性是像您一样读取文件,但转换xtype.convert().

library(data.table)
indt2 <- fread("test.csv", nrows = 100)[, x := type.convert(x)]
str(indt2)
# Classes ‘data.table’ and '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 ...
#  - attr(*, ".internal.selfref")=<externalptr> 
Run Code Online (Sandbox Code Playgroud)

附注:我通常喜欢使用type.convert()as.numeric(),以避免"被胁迫介绍来港"的警告在某些情况下触发.例如,

x <- c("1", "4", "NA", "6")
as.numeric(x)
# [1]  1  4 NA  6
# Warning message:
# NAs introduced by coercion 
type.convert(x)
# [1]  1  4 NA  6
Run Code Online (Sandbox Code Playgroud)

但当然你也可以使用as.numeric().


注意:此答案假定为data.table dev v1.9.5