我有一个非常直截了当的问题,即使经过几个小时的烦恼也让我感到悲伤,所以我想我会问你的帮助.我正在寻找一种直接的方法来返回一个仅包含某个原始矢量的最后一个元素的矢量.
这是我原来的矢量'a':
a<-c(0,0,1,0,0,1,0,0,1,0)
Run Code Online (Sandbox Code Playgroud)
我想生成向量'b',它与'a'的长度相同,并且只带有它的最后一个非缺失元素.换一种说法,
b = (0,0,0,0,0,0,0,0,1,0)
Run Code Online (Sandbox Code Playgroud)
我已经能够通过构建一个从向量'a'的末尾向后运行到第一个元素的循环来做到这一点,但这看起来显得不那么优雅.我相信有更好的方法.
如果有人好奇,那么更大的问题是:我试图改变一个向量的值,它对应于另一个向量的最后一个非缺失元素.
非常感谢您的帮助.
这只是为了一个单行的乐趣:
`[<-`(a, rev(which(as.logical(a)))[-1], 0)
## [1] 0 0 0 0 0 0 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
和一个略有不同的版本:
`[<-`(integer(length = length(a)), rev(which(a != 0))[1], 1)
## [1] 0 0 0 0 0 0 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
我相信这也应该有效
ifelse(cumsum(a)==sum(a), a, 0)
# [1] 0 0 0 0 0 0 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
这假定"缺失"值为零,非缺失值为1.如果您的值不是1,那么您可以这样做
ifelse(cumsum(a!=0)==sum(a!=0), a, 0)
Run Code Online (Sandbox Code Playgroud)
一种选择是
b<- numeric(length(a))
b[max(which(a!=0))] <- 1
b
#[1] 0 0 0 0 0 0 0 0 1 0
Run Code Online (Sandbox Code Playgroud)