0

我正在尝试编写一个函数:

给定向量的当前索引vect[i] == 0,如果vect[i+1] > 0,它将返回TRUE。否则,返回FALSE

我知道如何使用 for 循环将其写出来以遍历整个向量。但是,我对执行此操作的更有效方法感兴趣,即编写如下所示的简单函数,然后将其传递给which()orapply()函数?

ia <- function(x) {
    if(vect[i] == 0) {
        if(vect[i+1] > 0) {
            return TRUE
        } else {
            return FALSE
        }
    }
}

这行不通。如何使它工作,以便我可以将上述函数传递给您可以提出的哪个函数或任何更好的函数?

4

4 回答 4

2

怎么样

vect[which(vect==0) + 1] > 0
于 2013-06-24T18:49:51.960 回答
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
于 2013-06-24T18:51:10.193 回答
1

假设您希望向量的最后一个元素返回TRUE,如果它 == 0 与“后续”值无关。我会制作一个移位向量并进行两次比较:

vect <- rbinom(10, 1, prob=0.5)
shifted <- c(vect[-1],0)

然后进行比较:

result <- vect == 0 & shifted > 0
于 2013-06-24T18:50:45.277 回答
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参数分别返回除第一个和最后一个元素之外的所有元素,您可以使用它来将每个索引处的值与其后面的值进行比较。embedwith 参数2创建向量的两列矩阵,其中最后一列包括除最后一个元素之外的所有元素,第二列滞后 1。

于 2013-06-24T18:58:05.633 回答