2011-10-12 44 views
10

希望看看是否有人有更优雅的解决方案。但是,在使用apply的同时,跟踪当前索引的适当方式是什么?例如,假设我只想从当前正在评估的元素中取得总和,并将其转到我的向量的末尾。使用apply时保持跟踪当前索引

这是最好的方法吗?

y = rep(1,100) 
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])}) 

我很感激您的意见。

回答

8

这看起来更像sapply任务:

sapply(seq_along(y), function(x){sum(y[x:length(y)])}) 

为了您的具体的例子,也有其他的选择负载(如倒车矢量y,然后使用cumsum),但我想这是一般pattern: 使用seq_along或最差seq获取您感兴趣的序列,并将其传递给*apply

+1

只是需要澄清问题的问题:如果需要索引,是不是for循环更实用?或者我错过了这里的观点? – ROLO

+2

@ROLO:函数的'* apply'系列通常可以为结果提供非常合理的内存处理,并且如果使用'simplify = TRUE'(这些简单示例并不那么明显),则以实用的形式存储它们。从历史上看,它也曾经是比“普通”循环快得多的,但事实并非如此。所以,对于简单的情况,这并不重要。 –

+0

+1对于cumsum建议 – Thierry

3

rev(cumsum(y))会快很多当前实例:

> y = rep(1,100000) 
> system.time(apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})) 
    user system elapsed 
88.108 88.639 176.094 
> system.time(rev(cumsum(y))) 
    user system elapsed 
    0.002 0.001 0.004 
0

好了,例如可能已经有点不幸,但问题是如何了解一个指数,而在“应用”的功能或“sapply”仍未得到答复。你可能想看看

东西是

x <- 0 
l <- 1:10; names(l) <- letters[l] 
sapply(l,function(Y) { 
    x <<- x+1 
    a<-sum(x:length(l)) 
    cat("I am at ",names(l)[x]," valued ",a,".\n",sep="") 
    return(a) 
}) 

我也不爽,尽管“< < - ”招引用外部变量(感谢,斯蒂芬)。特别是在并行运行时,您希望清晰地表达请求索引或x/y位置在sapply中或应用的语义。更好的想法是最受欢迎的。