यदि प्रदर्शन एक प्राथमिकता है, तो उपयोग करें data.table
और na.omit()
वैकल्पिक परम के साथ cols=
।
na.omit.data.table
मेरे बेंचमार्क पर सबसे तेज़ है (नीचे देखें), चाहे सभी कॉलम के लिए या चुनिंदा कॉलम के लिए (ओपी प्रश्न भाग 2)।
यदि आप उपयोग नहीं करना चाहते हैं data.table
, तो उपयोग करें complete.cases()
।
एक वेनिला पर data.frame
, complete.cases
से तेज na.omit()
या है dplyr::drop_na()
। नोटिस जो na.omit.data.frame
समर्थन नहीं करता है cols=
।
बेंचमार्क परिणाम
यहां आधार (नीली), dplyr
(गुलाबी), और data.table
(पीले) तरीकों की तुलना या तो सभी को छोड़ने की है या लापता टिप्पणियों का चयन करें, स्वतंत्र होने की 5% संभावना के साथ 20 संख्यात्मक चर के 1 मिलियन टिप्पणियों के नोटिफ़िक डेटासेट पर, और लापता होने की संभावना है। भाग 2 के लिए 4 चर का सबसेट।
आपके परिणाम आपके विशेष डेटासेट की लंबाई, चौड़ाई और भिन्नता के आधार पर भिन्न हो सकते हैं।
Y अक्ष पर लॉग स्केल नोट करें।
बेंचमार्क स्क्रिप्ट
#------- Adjust these assumptions for your own use case ------------
row_size <- 1e6L
col_size <- 20 # not including ID column
p_missing <- 0.05 # likelihood of missing observation (except ID col)
col_subset <- 18:21 # second part of question: filter on select columns
#------- System info for benchmark ----------------------------------
R.version # R version 3.4.3 (2017-11-30), platform = x86_64-w64-mingw32
library(data.table); packageVersion('data.table') # 1.10.4.3
library(dplyr); packageVersion('dplyr') # 0.7.4
library(tidyr); packageVersion('tidyr') # 0.8.0
library(microbenchmark)
#------- Example dataset using above assumptions --------------------
fakeData <- function(m, n, p){
set.seed(123)
m <- matrix(runif(m*n), nrow=m, ncol=n)
m[m<p] <- NA
return(m)
}
df <- cbind( data.frame(id = paste0('ID',seq(row_size)),
stringsAsFactors = FALSE),
data.frame(fakeData(row_size, col_size, p_missing) )
)
dt <- data.table(df)
par(las=3, mfcol=c(1,2), mar=c(22,4,1,1)+0.1)
boxplot(
microbenchmark(
df[complete.cases(df), ],
na.omit(df),
df %>% drop_na,
dt[complete.cases(dt), ],
na.omit(dt)
), xlab='',
main = 'Performance: Drop any NA observation',
col=c(rep('lightblue',2),'salmon',rep('beige',2))
)
boxplot(
microbenchmark(
df[complete.cases(df[,col_subset]), ],
#na.omit(df), # col subset not supported in na.omit.data.frame
df %>% drop_na(col_subset),
dt[complete.cases(dt[,col_subset,with=FALSE]), ],
na.omit(dt, cols=col_subset) # see ?na.omit.data.table
), xlab='',
main = 'Performance: Drop NA obs. in select cols',
col=c('lightblue','salmon',rep('beige',2))
)
final[complete.cases(final),]
?