获取向量的最后一个元素
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))
我有一个非常直截了当的问题,尽管我苦恼了几个小时,但它仍然让我感到悲伤,所以我想我会寻求你的帮助。我正在寻找一种直接的方法来 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))