2

私はRで次のような状況にあります:

t <- (1:100) * 15
x <- c(134, 552, 864, 5000)

そして、xの値ごとに、t>xであるtの最初のインデックスを見つけたいと思います。以下はループを使用して機能します。

y <- numeric(length(x))
for (i in 1:length(x))
    y[i] <- which(t > x[i])[1]

# y
# [1]  9 37 58 NA

Rのループは「悪くて遅い」と教えられました。これが適度に大きいxで実行されるのにかかる時間は大したことではありませんが、もっと良い方法があるかどうか知りたいですか?

4

3 に答える 3

2

オブジェクトが大きすぎない場合(RAMが制限されないように)、関数は必要ありません*apply。関数は単なる隠しループです。

temp <- outer(x,t,'<')
y <- length(t) - (rowSums(temp)-1)
y[y>length(t)] <- NA
#[1]  9 37 58 NA
于 2013-03-25T15:29:57.077 に答える
1
fun <- function(x){
    which(t > x)[1]
}

R > sapply(x, fun)
[1]  9 37 58 NA
于 2013-03-25T15:11:53.593 に答える
1

ほぼ同じ:

require(functional)
apply(matrix(t > rep(x, each=length(t)), length(t)), 2, Compose(which, Curry(append, Inf), min))
## [1]   9  37  58 Inf
于 2013-03-25T15:19:11.057 に答える