我的情况类似于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>
答案 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