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

在R data.table中用NA替换所有空白的快速方法,r,data.table,na,R,Data.table,Na,我有一个大的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)

我有一个大的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)))
data=data.frame(cats=rep(c(“”,,'meow'),1e6),
犬只=代表(c(“纬”,NA),1e6)
系统时间(x使用此方法:

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

system.time(data[data=''| data='')假设您在填充数据时出错,下面是使用您在标记中使用的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的评论。

这里可能是通用的
数据表
方法。我还将使用你的正则表达式来处理几种类型的空格(我还没有看到其他答案这么做)。您可能不应该在所有列上运行此命令,而应该只在
因子
字符
列上运行此命令,因为其他类不接受空值

对于
系数
s

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

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

data[data==""] <- NA

data[data==”“]谢谢,我在charToDate(x)中得到了
错误:字符串不是标准的明确格式。
错误。如果它按预期工作,将尝试解决它并返回!仅使用
''
无法解决此问题,因为数据中有不同类型的空格。?您使用的是哪些数据?我猜不是示例中的数据集;)嗯,也许OP想要保留“”。@Tim,你能提供更多细节吗?OP使用正则表达式来删除它们
gsub(“^$| ^$”,NA,x)
(这几乎是不言自明的)我想你在
rep(dogs=c(“woof…
再次感谢)中填充数据时犯了一个错误@David.Worked用了4.79秒!现在我得到了未被
is.NA()
函数识别的NA值。如果我将其更改为
system.time(对于(indx中的j)集(data,I=grep(“^$| ^$”,data[[j]]),j=j,value=NA))
它失败了,您可能也遇到了这种情况?有没有办法将值设置为“标准”NA?在
Is.NA(NA\u character)
中识别NA\u字符不是很奇怪吗?但如果我对data.table使用此函数,我刚刚用NA\u字符替换了空格:
data[Is.NA(默认日期)]->dataNA
。还是我遗漏了什么?PS。有关新数据,请参阅有问题的编辑。好的,试试这个
indx@DavidArenburg我不知道为什么,但我正在测试
数据[data=''']
indx2 <- which(sapply(data, is.character)) 
for (j in indx2) set(data, i = grep("^$|^ $", data[[j]]), j = j, value = NA_character_)
data[data==""] <- NA