给定一个有序矢量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
如何让它发挥作用。
答案 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
此函数标识序列不再连续的数字。