检查数据框是否为空的最快方法

Ale*_*tov 2 r timing dataframe

检查 a 是否为data.frame空的最快(每微秒都很重要)的方法是什么?我在以下情况下需要它:

if (<df is not empty>) { do something here }
Run Code Online (Sandbox Code Playgroud)

可能的解决方案:

1)if(is.empty(df$V1) == FALSE来自 `spatstat' 包

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 
Run Code Online (Sandbox Code Playgroud)

但不知道如何计时2)。空 df 的解决方案是什么?

谢谢!

Fra*_*ank 5

假设我们有两种类型的 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)]
Run Code Online (Sandbox Code Playgroud)

你的if情况出现在一个循环中,比如

boundDF = data.frame()
for (i in seq_along(DFs)){ if (nrow(DFs[[i]]))
  boundDF <- rbind(boundDF,DFs[[i]])
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您处理问题的方式是错误的。该if声明不是必需的:do.call(rbind,DFs)或者 library(data.table); rbindlist(DFs)更快、更清晰。

通常,您在错误的地方寻求代码性能的改进。无论您在循环内执行什么操作,检查 the 非空的步骤都data.frame不会是花费最多时间的部分。虽然这一步可能还有优化的空间,但正如 Donald Knuth 所说,“过早的优化是万恶之源”。