从一个向量中获取最后一个元素

6

我有一个非常直接的问题,花了几个小时的时间仍然苦恼不已,所以我想请你帮忙。我正在寻找一种简单的方法来返回只包含某个原始向量的最后一个元素的向量。

这是我的原始向量 '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个回答

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

6

我相信这也应该可以工作

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)

5

一个选择是

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)

2
我认为这个是最好的:replace(0*a, which.max(cumsum(a)), 1)。直觉上,我认为任何使用 which 的东西都会很慢,因为输出长度事先不知道。但是 cumsumwhich.max 不是这种情况。 - flodel

3

另一个简单的选择:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接