2

我在 R 中有类似以下的情况:

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

我想为 x 中的每个值找到 t 中 t > 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 所花费的时间并不是什么大问题,但我想知道是否有更好的方法?

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 回答