读取CSV时自动将NAs转换为0

时间:2014-01-03 17:00:23

标签: r csv data.table

为了节省空间,我在CSV文件中省略了零作为一种稀疏表示(所有数据都是数字):

table = read.csv(text = "
V1,V2,V3
0.3,1.2,1.5
0.5,,2.1
,.1,")

这是我得到的:

> table

   V1  V2  V3
1 0.3 1.2 1.5
2 0.5  NA 2.1
3  NA 0.1  NA

我可以继续将NAs更改为0:

table[is.na(table)] = 0

    V1  V2  V3
1: 0.3 1.2 1.5
2: 0.5 0.0 2.1
3: 0.0 0.1 0.0

只是想知道在阅读时是否有一个单行班,最好是data.table的fread?:

table = fread("
V1,V2,V3
0.3,1.2,1.5
0.5,,2.1
,.1,")

更多信息:我想避免的原因

table[is.na(table)] = 0

虽然对我的数据的执行速度非常快,但此操作非常慢! (不确定原因。)我的数据集是336行x 3939列。 (G.格洛腾迪克的定制课程答案很快,谢谢你的想法!)

3 个答案:

答案 0 :(得分:7)

设置一个将空字段视为0的自定义类。鉴于设置它只是一行read.csv语句来读取数据:

# test data
Lines <- "V1,V2,V3
0.3,1.2,1.5
0.5,,2.1
,.1,
"

# set up custom class
setClass("empty.is.0")
setAs("character", "empty.is.0", 
      function(from) replace(as.numeric(from), from == "", 0))

# one liner
read.csv(text = Lines, strip.white = TRUE, colClasses = "empty.is.0")

答案 1 :(得分:3)

只需创建一个包装函数来读取它,然后转换NA,如果这是你经常做的事情。

my_read = function(..., replace=0) {
  data = fread(...)
  data[is.na(data)] = replace
  data
}

或者如果你想更通用并且为任何功能工作

my_gen_read = function(..., FUN="fread", replace=0) {
  FUN = match.fun(FUN)
  data = FUN(...)
  data[is.na(data)] = replace
  data
}

答案 2 :(得分:2)

我建议使用标准压缩工具,而不是创建自己的压缩工具:

dt = data.table(a = 1:10) # your data.table

zf = gzfile('filename.gz', 'w') # or bzfile or xzfile
write.csv(dt, zf, quote = F, row.names = F)
close(zf)

# then read either with read.csv or fread (version 1.8.11+)
df = read.csv('filename.gz')
dt = fread('zcat filename.gz')