Nếu hiệu suất là ưu tiên, sử dụng data.table
và na.omit()
với tùy chọn param cols=
.
na.omit.data.table
là điểm nhanh nhất trong điểm chuẩn của tôi (xem bên dưới), cho dù cho tất cả các cột hoặc cho các cột được chọn (câu hỏi OP phần 2).
Nếu bạn không muốn sử dụng data.table
, hãy sử dụngcomplete.cases()
.
Trên một vani data.frame
, complete.cases
nhanh hơn na.omit()
hoặcdplyr::drop_na()
. Lưu ý rằng na.omit.data.frame
không hỗ trợ cols=
.
Kết quả điểm chuẩn
Dưới đây là so sánh cơ sở (màu xanh), dplyr
(màu hồng) và data.table
(màu vàng) để loại bỏ tất cả hoặc chọn các quan sát bị thiếu, trên bộ dữ liệu đáng chú ý của 1 triệu quan sát của 20 biến số với khả năng bị mất 5% độc lập và tập hợp con của 4 biến cho phần 2.
Kết quả của bạn có thể thay đổi dựa trên chiều dài, chiều rộng và độ thưa của bộ dữ liệu cụ thể của bạn.
Lưu ý quy mô log trên trục y.
Kịch bản điểm chuẩn
#------- 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),]
gì?