for
ループとapply
関数の間に大きな時間差があります。Apply関数がForループよりも100時間長くなります。
は私が各列のNAの割合が何であるかをチェックし、私は検査するための新たなDFとして結果を返すようにしたい73個の列で約20万レコードを含むデータフレーム(alldat)を持っています。 apply
関数は4秒とするために取る
datacheck <- as.data.frame(apply(alldat,2,function (x) round(sum(is.na(x))/dim(alldat)[1], digits = 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
関数I 2つの方法でそれを行っていますループ機能が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