7

私は 2 つのベクトルeとを持っていgます。e各要素の要素の割合gが小さいことを知りたいです。R でこれを実装する 1 つの方法は次のとおりです。

set.seed(21)
e <- rnorm(1e4)
g <- rnorm(1e4)
mf <- function(p,v) {100*length(which(v<=p))/length(v)}
mf.out <- sapply(X=e, FUN=mf, v=g)

eorが大きいgと、実行に時間がかかります。このコードをより速く実行するために、このコードをどのように変更または適応させることができますか?

注:上記の関数は、dismo パッケージmfの関数のコードに基づいています。mess

4

1 に答える 1

8

これが非常に遅い理由は、関数length(e)時間を呼び出しているためです。小さなベクトルの場合は大きな違いはありませんが、R関数呼び出しのオーバーヘッドは、実際には大きなベクトルになり始めます。

通常、これをコンパイル済みコードに移動する必要がありますが、幸いなことに、次を使用できますfindInterval

set.seed(21)
e <- rnorm(1e4)
g <- rnorm(1e4)
O <- findInterval(e,sort(g))/length(g)

# Now for some timings:
f <- function(p,v) mean(v<=p)
system.time(o <- sapply(e, f, g))
#   user  system elapsed 
#   0.95    0.03    0.98
system.time(O <- findInterval(e,sort(g))/length(g))
#   user  system elapsed 
#      0       0       0 
identical(o,O)  # may be FALSE
all.equal(o,O)  # should be TRUE

# How fast is this on large vectors?
set.seed(21)
e <- rnorm(1e7)
g <- rnorm(1e7)
system.time(O <- findInterval(e,sort(g))/length(g))
#   user  system elapsed 
#  22.08    0.08   22.31
于 2012-10-19T21:20:39.567 に答える