我试图写一个函数:
给定向量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
}
}
}
这不管用。如何使其工作,使我可以将上面的函数传递到哪个函数或任何更好的函数,您可以提出?
发布于 2013-06-24 10:51:10
试试像这样的东西
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
发布于 2013-06-24 10:49:51
怎么样
vect[which(vect==0) + 1] > 0
发布于 2013-06-24 10:58:05
以下是两种方法:
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
和带有-1
参数的head
分别返回第一个和最后一个元素之外的所有元素,您可以使用它来比较每个索引的值和后面的索引值。带参数的embed
2
创建向量的两列矩阵,其中最后一列包含除最后一个元素之外的所有元素,第二列滞后于1。
https://stackoverflow.com/questions/17282716
复制相似问题