在R data.table中用NA替换所有空白的快速方法
我有一个大的data.table对象(1M行和220列),我想用NA替换所有空格(“”)。我在这方面找到了一个解决方案,但对于我的数据表来说速度非常慢(已经需要15分钟以上) 另一个职位的例子:在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 = 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