获取向量的最后一个元素

Grabbing the last element of a vector

我有一个非常直截了当的问题,尽管我苦恼了几个小时,但它仍然让我感到悲伤,所以我想我会寻求你的帮助。我正在寻找一种直接的方法来 return 一个仅包含某些原始向量的最后一个元素的向量。

这是我的原始向量,'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' 的末尾到它的第一个元素向后循环来做到这一点,但这似乎显然不够优雅。我相信有更好的方法。

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

非常感谢您的帮助。

一个选项是

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

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

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

我相信这也应该有效

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

这假设 "missing" 值为零,非缺失值为 1。如果你的值不是 1,你会做

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

我来晚了一点,但还有另一个选择:

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)

另一个简单的选项:

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