检查data.frame
是否为空的最快(每微秒计数)方式是多少?我需要在以下背景下:
if (<df is not empty>) { do something here }
可能的解决方案:
1)来自`spatstat'软件包的if(is.empty(df$V1) == FALSE
2)if(nrow(df)!= 0)
3)你的解决方案
我能做到:
library(microbenchmark)
microbenchmark(is.empty(df),times=100)
Unit: microseconds
expr min lq mean median uq max neval
is.empty(df) 5.8 5.8 6.9 6 6.2 66 100
但不确定如何计时2)。你的空df解决方案是什么?
谢谢!
答案 0 :(得分:4)
假设我们有两种类型的data.frames:
emptyDF = data.frame(a=1,b="bah")[0,]
fullDF = data.frame(a=1,b="bah")
DFs = list(emptyDF,fullDF)[sample(1:2,1e4,replace=TRUE)]
并且您的if
条件会出现在像
boundDF = data.frame()
for (i in seq_along(DFs)){ if (nrow(DFs[[i]]))
boundDF <- rbind(boundDF,DFs[[i]])
}
在这种情况下,您以错误的方式处理问题。不需要if
语句:do.call(rbind,DFs)
或library(data.table); rbindlist(DFs)
更快更清晰。
通常,您正在寻找在错误的位置改进代码性能的方法。 无论您在循环中执行什么操作,检查data.frame
的非空虚的步骤都不会是花费最多时间的部分。虽然在这一步骤中可能存在优化空间,但是#34;过早优化是所有邪恶的根源&#34;正如唐纳德克努特所说。