2013-03-25 108 views
2

的许多值I具有类似于R中的以下的情况:矢量化头(其(T> X)中,n = 1)对于x

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

我想找到x中的每个值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上运行的时间是不是一个致命弱点,我想:使用循环以下工作想知道是否有更好的方法?

+0

R上的循环不是“不好和慢”。由于您预先分配了循环所填充的对象,因此循环非常好。 – Roland 2013-03-25 15:36:46

+0

因此,循环中的主要开销是重新分配更改大小的对象,而不是处理循环(边界检查等)中固有的东西? – kai 2013-03-30 00:40:47

+1

是的。 'for'循环本身实际上非常高效。初学者经常在循环内部使用非常低效的代码(如增长一个对象),并让人误解循环很慢。当然,真正的矢量化函数(不包括'* apply'函数)总是比循环更快。 – Roland 2013-03-30 12:40:06

回答

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

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

无需为此定义一个命名函数。 ;-) – 2013-03-25 15:21:12

+0

啊。我试图为此做“应用”工作,但没有到达任何地方。 – kai 2013-03-25 15:25:01

+0

或者使用'which.max'并删除'[1]' – hadley 2013-03-25 23:41:20

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 
2

如果对象不是太大(所以RAM没有限制),则不需要*apply功能,这些功能都只是隐藏循环。

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

我很喜欢这个,但'temp'确实非常大。 – kai 2013-03-30 00:39:32

相关问题