簡體   English   中英

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

[英]Fast way to replace all blanks with NA in R 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)))

是否有更多 data.table 快速方法來實現這一目標?

確實提供的數據看起來和原始數據不太一樣,只是舉個例子。 我的真實數據的以下子集給出了 CharToDate(x) 錯誤:

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

這可能是執行此操作的通用data.table方式。 我還將使用您的正則表達式來處理幾種類型的空白(我還沒有看到其他答案這樣做)。 您可能不應該在所有列上運行它,而應該只在factorcharacter列上運行,因為其他類不會接受空白值。

對於factor s

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

對於character s

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

使用這種方法:

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[data==""] <- NA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM