Я столкнулся с огромной разницей во времени между циклом for
и функцией apply
.
У меня есть кадр данных (alldat), который содержит около 200 тыс. записей с 73 столбцами. Я хочу проверить, каков процент NA в каждом столбце, и вернуть результат в виде нового DF для проверки. Я сделал это 2 способами:
1) функция с циклом for
:
Nacheck = function(a){
a <- as.data.frame(a)
vecNA <- rep(NA, dim(a)[2])
for (i in 1:dim(a)[2]){
vecNA[i] <- sum(is.na(a[, i]))
}
rowss <- rep(nrow(a), length(vecNA))
NA_PCT <- vecNA/rowss
colna <- colnames(a)
datacheck <- as.data.frame(t(rbind(colna, NA_PCT)))
return(datacheck)
}
datacheck1 = Nacheck(alldat)
2) apply
функция по столбцу:
datacheck <- as.data.frame(apply(alldat,2,function (x) round(sum(is.na(x))/dim(alldat)[1], digits = 2)))
функция apply
занимает 4 секунды, а функция цикла for занимает менее 0,023 секунды
start.time <- Sys.time()
datacheck <- as.data.frame(apply(alldat,2,function (x) round(sum(is.na(x))/dim(alldat)[1], digits = 2)))
end.time <- Sys.time()
time.takenapply <- end.time - start.time
time.takenapply
Разница во времени 4,304 секунды
for
время цикла:
start.time <- Sys.time()
datacheck = Nacheck(alldat)
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Разница во времени 0,02399993 сек.
Я делаю что-то неправильно? Любая идея, что вызывает эту разницу во времени?