我有一个非常直截了当的问题,即使经过几个小时的扯皮也让我感到悲伤,所以我想我会问你的帮助。我正在寻找一种直接的方法来返回一个仅包含某个原始矢量的最后一个元素的矢量。
这是我原来的矢量'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'的末尾向后运行到第一个元素的循环来做到这一点,但这似乎显得不那么优雅。我确信有更好的方法。
如果有人好奇,那么更大的问题是:我试图改变一个向量的值,它对应于另一个向量的最后一个非缺失元素。
非常感谢您的帮助。
答案 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))