对于x的许多值,矢量化头(其中(t> x),n = 1)

时间:2013-03-25 15:05:30

标签: r

我的情况类似于R中的以下情况:

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

我想为x中的每个值找到t中的第一个索引,其中t&gt; x是。以下使用循环:

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所需的时间不是一个交易破坏者,但我想知道是否有更好的方法? / p>

3 个答案:

答案 0 :(得分:2)

如果对象不是太大(因此RAM没有限制),则不需要*apply函数,这些函数只是隐藏的循环。

temp <- outer(x,t,'<')
y <- length(t) - (rowSums(temp)-1)
y[y>length(t)] <- NA
#[1]  9 37 58 NA

答案 1 :(得分:1)

fun <- function(x){
    which(t > x)[1]
}

R > sapply(x, fun)
[1]  9 37 58 NA

答案 2 :(得分: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