在 R data.table 中用 NA 替换所有空格的快速方法

Fast way to replace all blanks with NA in R data.table

我有一个很大的 data.table 对象(100 万行和 220 列),我想用 NA 替换所有空格 ('')。我在这个 Post 中找到了一个解决方案,但它对我的数据 table 来说非常慢(已经超过 15 分钟) 另一个示例 post:

 data = data.frame(cats=rep(c('', ' ', 'meow'),1e6),
                   dogs=rep(c("woof", " ", NA),1e6))
 system.time(x<-apply(data, 2, function(x) gsub("^$|^ $", NA, x)))

有没有更data.table更快的方法来实现这个?

确实提供的数据和原来的数据不太一样,只是举个例子。我的真实数据的以下子集给出了 CharToDate(x) 错误:

DT <- data.table(ID=c(10),DEFAULT_DATE=as.Date("2012-07-31"),value='')
system.time(DT[DT=='']<-NA)

使用这种方法:

system.time(data[data==''|data==' ']<-NA)
  user  system elapsed 
  1.47    0.19    1.66 

system.time(y<-apply(data, 2, function(x) gsub("^$|^ $", NA, x)))
  user  system elapsed 
  3.41    0.20    3.64

假设您在填充数据时出错,下面是使用您在标记中使用的 data.table 的解决方案。

library(data.table)
data = data.table(cats=rep(c('', ' ', 'meow'),1000000),dogs=rep(c("woof", " ", NA),1000000))
system.time(data[cats=='', cats := NA][dogs=='', dogs := NA])
#  user  system elapsed 
# 0.056   0.000   0.059 

如果您有很多专栏,请参阅 David 的评论。

这可能是通用的 data.table 方法。我还将使用您的正则表达式来处理多种类型的空白(我还没有看到其他答案这样做)。你可能不应该 运行 这超过 所有 你的专栏,而应该只超过 factorcharacter 的专栏,因为其他 类 赢了'接受空白值。

factors

indx <- which(sapply(data, is.factor))
for (j in indx) set(data, i = grep("^$|^ $", data[[j]]), j = j, value = NA_integer_) 

characters

indx2 <- which(sapply(data, is.character)) 
for (j in indx2) set(data, i = grep("^$|^ $", data[[j]]), j = j, value = NA_character_)

在尝试了几种不同的方法之后,我发现最快最简单的选择是:

data[data==""] <- NA