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

Tim*_*cht 2 r na data.table

我有一个大的data.table对象(1M行和220列),我想用NA替换所有空格('').我在这篇帖子中找到了一个解决方案,但是我的数据表速度非常慢(已超过15分钟)其他帖子的示例:

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

有没有更多的data.table快速实现这一目标的方法?

实际上,提供的数据与原始数据看起来不太像,只是举一个例子.我的实际数据的以下子集给出了CharToDate(x)错误:

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

Dav*_*urg 13

这可能data.table是执行此操作的通用方法.我也将使用你的正则表达式处理几种类型的空白(我没有看到其他答案这样做).您可能不应该在所有列上运行此操作,而只是在一个factor或多个列上运行character,因为其他类不接受空值.

对于factors

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

对于characters

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

  • 非常感谢(再次)@David.工作在4.79秒! (2认同)

Col*_*vel 6

使用这种方法:

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