我在for
循環和apply
函數之間遇到了巨大的時間差。應用函數花費的時間比R中的For循環長100倍
我有一個數據幀(alldat),包含大約200k條記錄和73列我想檢查每列中NA的百分比是多少,並返回結果作爲一個新的DF供我檢查。
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秒,且對於循環功能需要小於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秒
時間的區別就是我做錯了什麼?任何想法是什麼導致這個時間差異?
'apply'函數將矩陣作爲參數。將輸入數據內部轉換爲矩陣可能會導致此時差。此外,我會使用'lapply'來代替,因爲您對列執行了計算。 –
或'apply(df,2,function(x)sum(is.na(x))' – amonk
不是原因,但爲什麼不使用'nrow(a)','ncol(a)'而不是dim(a)[1]',dim(a)[2]'? – digEmAll