【发布时间】:2019-09-18 13:54:29
【问题描述】:
想看看是否有人有更优雅的解决方案。但是在使用 apply 时跟踪当前索引的适当方法是什么?例如,假设我只想从我正在评估的当前元素中获取总和,直到我的向量末尾。
这是最好的方法吗?
y = rep(1,100)
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})
感谢您的意见。
【问题讨论】:
标签: r
想看看是否有人有更优雅的解决方案。但是在使用 apply 时跟踪当前索引的适当方法是什么?例如,假设我只想从我正在评估的当前元素中获取总和,直到我的向量末尾。
这是最好的方法吗?
y = rep(1,100)
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})
感谢您的意见。
【问题讨论】:
标签: r
这看起来更像是sapply 的任务:
sapply(seq_along(y), function(x){sum(y[x:length(y)])})
对于您的具体示例,还有许多其他选项(例如反转矢量 y,然后使用 cumsum),但我想这是一般模式:
使用seq_along 或最差的seq 获取您感兴趣的序列,并将其传递给*apply。
【讨论】:
*apply 系列函数通常可以为结果提供非常合理的内存处理,并在 simplify=TRUE 时以实用的形式存储它们(这些简单的示例并不那么明显)。从历史上看,它也曾经是这样,它们比“正常”循环快得多,但现在不是这样了。所以,对于简单的情况,它并没有太大的影响。
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
【讨论】:
好吧,这个例子可能有点不幸,但是如何在“apply”或“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)
})
我也很不高兴,尽管引用外部变量的“
【讨论】:
此回复尚未收到满意的答复。全局变量可以像请求的 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]
})
【讨论】: