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)
哪个产生
> 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位)
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> 
系统命令 cat test.csv | tr -d '\"' 解释:
cat test.csv 将文件读取到标准输出| 是一个管道,使用上一个命令的输出作为下一个命令的输入 tr -d '\"'从当前输入中删除(-d)所有出现的双引号('\"')选项2:阅读后的强制
由于选项1似乎不适用于您的系统,另一种可能性是像您一样读取文件,但转换x列type.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> 
附注:我通常喜欢使用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
但当然你也可以使用as.numeric().
注意:此答案假定为data.table dev v1.9.5