【问题标题】:Keeping track of current index when using apply使用 apply 时跟踪当前索引
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 只是一个用于澄清所讨论问题的问题:如果需要索引,for循环不是更实用吗?还是我错过了这里的重点?
    • @ROLO:*apply 系列函数通常可以为结果提供非常合理的内存处理,并在 simplify=TRUE 时以实用的形式存储它们(这些简单的示例并不那么明显)。从历史上看,它也曾经是这样,它们比“正常”循环快得多,但现在不是这样了。所以,对于简单的情况,它并没有太大的影响。
    • 我觉得cumsum可能很有趣。您能否详细说明如何在 sapply 中实现它?
    【解决方案2】:

    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 
    

    【讨论】:

      【解决方案3】:

      好吧,这个例子可能有点不幸,但是如何在“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)
      })
      

      我也很不高兴,尽管引用外部变量的“

      【讨论】:

        【解决方案4】:

        此回复尚未收到满意的答复。全局变量可以像请求的 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]
        })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-10
          • 2014-09-19
          • 1970-01-01
          • 2021-12-24
          • 1970-01-01
          • 2017-12-09
          • 2022-01-06
          • 2013-01-08
          相关资源
          最近更新 更多