R中的哪个或者应用函数

时间:2013-06-24 18:43:32

标签: r

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

给定向量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
        }
    }
}

这不起作用。如何让它工作,以便我可以将上述功能传递给你可以提出的功能或更好的功能?

4 个答案:

答案 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.