使用apply时跟踪当前索引

时间:2011-10-12 12:15:16

标签: r

想知道某人是否有更优雅的解决方案。但是在使用apply时跟踪当前索引的适当方法是什么。例如,假设我想从我正在评估的当前元素中获取总和,直到我的向量结束。

这是最好的方法吗?

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

感谢您的意见。

4 个答案:

答案 0 :(得分:9)

这看起来更像是sapply的任务:

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

对于您的具体示例,还有许多其他选项(例如反转向量y然后使用cumsum),但我想这是一般模式: 使用seq_along或最差seq来获取您感兴趣的序列,并将其传递给*apply

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

答案 2 :(得分:3)

嗯,这个例子可能有些不幸,但问题是如何在"的功能中学习索引?#34;或者" 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)
})

我也很不高兴,尽管&#34;&lt;&lt; - &#34;引用外部变量的技巧(谢谢,Stephan)。特别是在并行运行时,您希望以某种方式清楚地表达语义,请求sapply或apply中的索引或x / y位置。更好的想法是最受欢迎的。

答案 3 :(得分:0)

此答复尚未收到令人满意的答复。全局变量的工作方式如smoe请求的,但它似乎并不比for循环快,请参见下面的示例。

df=data.frame(a=1:100000,b=1:100000,y=rep(NA,100000))
ind=1
system.time(sapply(df$a,function(x){
  df$y[ind]<<-x+df$b[ind]
  ind<<-ind+1
}))

system.time(for(i in 1:nrow(df)){
  df$y[i]=df$a[i]+df$b[i]
})