想知道某人是否有更优雅的解决方案。但是在使用apply时跟踪当前索引的适当方法是什么。例如,假设我想从我正在评估的当前元素中获取总和,直到我的向量结束。
这是最好的方法吗?
y = rep(1,100)
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})
感谢您的意见。
答案 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]
})