【问题标题】:Grabbing the last element of a vector抓取向量的最后一个元素
【发布时间】:2015-03-19 20:49:18
【问题描述】:

我有一个非常直截了当的问题,尽管我已经绞尽脑汁了几个小时,但它还是让我很伤心,所以我想我会寻求你的帮助。我正在寻找一种简单的方法来返回仅包含某个原始向量的最后一个元素的向量。

这是我的原始向量,'a':

a<-c(0,0,1,0,0,1,0,0,1,0)

我想生成向量“b”,它的长度与“a”相同,并且只包含最后一个非缺失元素。换句话说,

b = (0,0,0,0,0,0,0,0,1,0)

我已经能够通过构建一个从向量“a”的末尾向后运行到它的第一个元素的循环来做到这一点,但这似乎非常不雅。我相信有更好的方法。

如果有人好奇,更大的问题是:我正在尝试更改一个向量的值,它对应于另一个向量的最后一个非缺失元素。

非常感谢您的帮助。

【问题讨论】:

    标签: r vector subset


    【解决方案1】:

    这只是为了好玩:

    `[<-`(a, rev(which(as.logical(a)))[-1], 0)
    ## [1] 0 0 0 0 0 0 0 0 1 0
    

    还有一个稍微不同的版本:

    `[<-`(integer(length = length(a)), rev(which(a != 0))[1], 1)
     ## [1] 0 0 0 0 0 0 0 0 1 0
    

    【讨论】:

      【解决方案2】:

      我相信这也应该有效

      ifelse(cumsum(a)==sum(a), a, 0)
      # [1] 0 0 0 0 0 0 0 0 1 0
      

      这假定“缺失”值是零,非缺失值是 1。如果你的值不是 1,你会这样做

      ifelse(cumsum(a!=0)==sum(a!=0), a, 0)
      

      【讨论】:

        【解决方案3】:

        一个选项是

        b<- numeric(length(a))
        b[max(which(a!=0))] <- 1
        b
        #[1] 0 0 0 0 0 0 0 0 1 0
        

        【讨论】:

          【解决方案4】:

          我来晚了,但这里有另一种选择:

          a[head(which(a == 1), -1)] <- 0
          

          replace(a, head(which(a == 1), -1), 0)
          

          基准测试

          Unit: milliseconds
                expr     min      lq  median      uq    max neval
             akrun()   8.600   9.201  11.346  12.531  68.45   100
           plourde()   9.034   9.767  11.545  12.498  69.33   100
             flick() 164.792 215.759 221.868 227.237 333.72   100
            thomas()   4.210   6.427   8.108   9.913  66.65   100
          

          函数

          akrun <- function() {
              b<- numeric(length(a))
              b[max(which(a!=0))] <- 1
              b
          }
          plourde <- function() replace(a, head(which(a == 1), -1), 0)
          flick <- function() ifelse(cumsum(a)==sum(a), a, 0)
          thomas <- function() `[<-`(a, rev(which(as.logical(a)))[-1], 0)
          

          【讨论】:

          • 我觉得这可以打败他们:replace(0*a, which.max(cumsum(a)), 1)。直觉上,我认为任何使用which 的东西都会很慢,因为事先不知道输出长度。 cumsumwhich.max 都不是这样。
          【解决方案5】:

          另一个简单的选择:

          n = max(which(as.logical(a))) - 1
          c(numeric(n), tail(a, -n))
          

          【讨论】:

            猜你喜欢
            • 2015-01-11
            • 2012-08-20
            • 1970-01-01
            • 2012-12-25
            • 1970-01-01
            • 2011-04-14
            • 2016-10-01
            • 2022-11-26
            • 1970-01-01
            相关资源
            最近更新 更多