Dua pendekatan yang ditawarkan sejauh ini gagal dengan set data besar sebagai (di antara masalah memori lainnya) yang mereka buat is.na(df), yang akan menjadi objek dengan ukuran yang sama df.
Berikut adalah dua pendekatan yang lebih hemat memori dan waktu
Pendekatan menggunakan Filter
Filter(function(x)!all(is.na(x)), df)
dan pendekatan menggunakan data.table (untuk efisiensi waktu dan memori umum)
library(data.table)
DT <- as.data.table(df)
DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]
contoh menggunakan data besar (30 kolom, 1e6 baris)
big_data <- replicate(10, data.frame(rep(NA, 1e6), sample(c(1:8,NA),1e6,T), sample(250,1e6,T)),simplify=F)
bd <- do.call(data.frame,big_data)
names(bd) <- paste0('X',seq_len(30))
DT <- as.data.table(bd)
system.time({df1 <- bd[,colSums(is.na(bd) < nrow(bd))]})
# error -- can't allocate vector of size ...
system.time({df2 <- bd[, !apply(is.na(bd), 2, all)]})
# error -- can't allocate vector of size ...
system.time({df3 <- Filter(function(x)!all(is.na(x)), bd)})
## user system elapsed
## 0.26 0.03 0.29
system.time({DT1 <- DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]})
## user system elapsed
## 0.14 0.03 0.18