Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用apply时跟踪当前索引_R - Fatal编程技术网

R 使用apply时跟踪当前索引

R 使用apply时跟踪当前索引,r,R,想看看是否有人有更优雅的解决方案。但是,在使用apply时,跟踪当前索引的适当方法是什么。例如,假设我只想从我正在计算的当前元素中取和,直到向量的末尾 这是最好的方法吗 y = rep(1,100) apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])}) 非常感谢您的意见。这看起来更像是sapply的任务: sapply(seq_along(y), function(x){sum(y[x:length(y)

想看看是否有人有更优雅的解决方案。但是,在使用apply时,跟踪当前索引的适当方法是什么。例如,假设我只想从我正在计算的当前元素中取和,直到向量的末尾

这是最好的方法吗

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

非常感谢您的意见。

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

sapply(seq_along(y), function(x){sum(y[x:length(y)])})
对于您的特定示例,还有很多其他选项(例如反转向量
y
,然后使用
cumsum
),但我猜这是一般模式: 使用
seq_
或者最坏的情况下使用
seq
获取您感兴趣的序列,并将其传递给
*apply
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)
})

x此响应尚未收到满意的答案。全局变量的工作方式类似于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]
})
df=data.frame(a=1:100000,b=1:100000,y=rep(NA,100000))
ind=1
系统时间(sapply)(df$a,函数(x){

df$y[ind]只是一个澄清所讨论问题的问题:如果需要索引,for循环不是更实用吗?或者我没有抓住要点吗?@ROLO:apply函数族通常可以为结果提供非常合理的内存处理,并以实用的形式存储它们,如果
simplify=TRUE
(这在这些简单的例子中并不明显)。从历史上看,它们也曾比“普通”循环快很多,但现在已经不是这样了。因此,对于简单的情况,这并不重要。我觉得cumsum可能非常有趣。请您详细说明如何在sapply中实现它?