這與R- view all the columns names with any NA爲什麼data.table在這個例子中如此緩慢R中
我比較data.frame和data.table版本,發現data.table是慢10倍。這與data.table中的大多數代碼相比,實際上要比data.frame版本快得多。
set.seed(49)
df1 <- as.data.frame(matrix(sample(c(NA,1:200), 1e4*5000, replace=TRUE), ncol=5000))
library(microbenchmark)
f1 <- function() {names(df1)[sapply(df1, function(x) any(is.na(x)))]}
f2 <- function() { setDT(df1); names(df1)[df1[,sapply(.SD, function(x) any(is.na(x))),]] }
microbenchmark(f1(), f2(), unit="relative")
Unit: relative
expr min lq median uq max neval
f1() 1.00000 1.00000 1.000000 1.000000 1.000000 100
f2() 10.56342 10.20919 9.996129 9.967001 7.199539 100
setDT事先:
set.seed(49)
df1 <- as.data.frame(matrix(sample(c(NA,1:200), 1e4*5000, replace=TRUE), ncol=5000))
setDT(df1)
library(microbenchmark)
f1 <- function() {names(df1)[sapply(df1, function(x) any(is.na(x)))]}
f2 <- function() {names(df1)[df1[,sapply(.SD, function(x) any(is.na(x))),]] }
microbenchmark(f1(), f2(), unit="relative")
Unit: relative
expr min lq median uq max neval
f1() 1.00000 1.00000 1.00000 1.00000 1.000000 100
f2() 10.64642 10.77769 10.79191 10.77536 7.716308 100
可能是什麼原因?
作爲小費,你可以直接調用'is.na(DT)'在data.table/data.frame權。 – 2014-09-29 04:52:12
@RicardoSaporta - 但這會創建一個與data.table – mnel 2014-09-29 05:06:52
@mnel相同的矩陣,是的,矩陣上的colSums是faaaaast :) – 2014-09-29 05:15:23