我正在尝试编写一个函数:
给定向量vect[i] == 0
的当前索引,如果vect[i+1] > 0
,则返回TRUE
。否则,请返回FALSE
。
我知道如何使用for循环遍历整个向量来编写它。但是,我感兴趣的是更多高效这样做的方法,即编写如下的简单函数,然后将其传递给which()
或apply()
函数?
ia <- function(x) {
if(vect[i] == 0) {
if(vect[i+1] > 0) {
return TRUE
} else {
return FALSE
}
}
}
这不起作用。如何让它工作,以便我可以将上述功能传递给你可以提出的功能或更好的功能?
答案 0 :(得分:2)
怎么样
vect[which(vect==0) + 1] > 0
答案 1 :(得分:2)
尝试这样的事情
ia <- function(x) c(x[-length(x)] == 0 & x[-1] > 0, FALSE)
x <- c(1, 3, 0, 3, 4, 5, 0, 0, -3, 4, 0, 1, 0, -3, 10)
ia(x)
[1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[11] TRUE FALSE FALSE FALSE
cbind(x, ia(x))
x
[1,] 1 0
[2,] 3 0
[3,] 0 1
[4,] 3 0
[5,] 4 0
[6,] 5 0
[7,] 0 0
[8,] 0 0
[9,] -3 0
[10,] 4 0
[11,] 0 1
[12,] 1 0
[13,] 0 0
[14,] -3 0
[15,] 10 0
我们也可以使用which
which(ia(x))
[1] 3 11
答案 2 :(得分:1)
让我们假设您希望向量的最后一个元素返回TRUE
,如果它是== 0与“跟随”值无关。我会做一个移位向量并进行两次比较:
vect <- rbinom(10, 1, prob=0.5)
shifted <- c(vect[-1],0)
然后进行比较:
result <- vect == 0 & shifted > 0
答案 3 :(得分:0)
以下是两种方式:
k <- c(0,1,0,2,0,0,3,0)
result <- c(mapply(function(x,y) x == 0 & y > 0, head(k, -1), tail(k, -1)), FALSE)
和
c(apply(embed(k,2), 1, function(row) row[1] > 0 & row[2] == 0), FALSE)
带有tail
参数的 head
和-1
分别返回除了第一个和最后一个元素之外的所有元素,您可以使用它来比较每个索引处的值与之后的值。带有参数embed
的{{1}}创建向量的两列矩阵,其中最后一列包括除最后一个元素以外的所有元素,第二列滞后为1.