抓住矢量的最后一个元素

时间:2015-03-19 20:49:18

标签: r vector subset

我有一个非常直截了当的问题,即使经过几个小时的扯皮也让我感到悲伤,所以我想我会问你的帮助。我正在寻找一种直接的方法来返回一个仅包含某个原始矢量的最后一个元素的矢量。

这是我原来的矢量'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'的末尾向后运行到第一个元素的循环来做到这一点,但这似乎显得不那么优雅。我确信有更好的方法。

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

非常感谢您的帮助。

5 个答案:

答案 0 :(得分:7)

这只是为了一个单行的乐趣:

`[<-`(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

答案 1 :(得分:6)

我相信这也应该有用

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

这假设&#34;缺失&#34;值为零,非缺失值为1。如果您的值不是1,那么您可以

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

答案 2 :(得分:5)

一个选项是

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

答案 3 :(得分: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)

答案 4 :(得分:3)

另一个简单的选择:

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