R:给出连续数组的递归函数

时间:2015-06-22 15:44:02

标签: r if-statement recursion vector integer

给定一个有序矢量x

x <- c(1,2,4,6,7,10,11,12,15)

我正在尝试编写一个小函数,它将产生一个类似大小的向量y,给出最后一个连续的整数,以便对连续的数字进行分组。就我而言,它是(定义组2,4,7,12和15):

> y
[1]  2  2  4  7  7 12 12 12 15

我尝试了这个递归的想法(x是向量,并且我是一个在大多数情况下会以1开头的索引:如果下一个索引的内容比当前i大1,那么用i调用函数+1;否则返回内容):

fun <- function(x,i){
  ifelse(x[i]+1 == x[i+1],
         fun(x,i+1),
         return(x[i]))
}

然而:

> sapply(x,fun,1)
[1] NA NA NA NA NA NA NA NA NA

如何让它发挥作用。

2 个答案:

答案 0 :(得分:3)

当您真正希望它应用于fun的所有值时,您的公开呼叫正在x的所有值中应用i。为了让sapply做我想做的事情,你可以做到以下几点:

sapply(X = 1:length(x), FUN = fun, x = x)

[1]  2  2  4  7  7 12 12 12 NA

虽然它返回NA作为最后一个值而不是15.这是因为我不认为你的函数被设置为处理向量的最后一个值(没有x [10],所以它返回NA) 。你可以编辑你的功能来相当容易地处理它。

答案 1 :(得分:2)

也许这会有所帮助:

find_non_consec <- function(x){ c(x[which(as.logical(diff(x)-1))],x[length(x)]) }
x <- c(1,2,4,6,7,10,11,12,15)
res <- find_non_consec(x)

结果是:

> res
[1]  2  4  7 12 15

此函数标识序列不再连续的数字。