Проверьте, является ли вектор в R последовательным? - PullRequest
4 голосов
/ 14 декабря 2011

Как я могу проверить, является ли целочисленный вектор «последовательным», т. Е. Что разница между последующими элементами ровно одна. Я чувствую, что мне не хватает чего-то вроде "is.sequential"

Вот моя собственная функция:

is.sequential <- function(x){
    all(diff(x) == rep(1,length(x)-1))
}    

Ответы [ 2 ]

6 голосов
/ 14 декабря 2011

Нет необходимости в rep, так как 1 будет повторяться:

Отредактировано, чтобы разрешить 5: 2 как истинное

is.sequential <- function(x){
  all(abs(diff(x)) == 1)
}  

Для учета различных последовательностей

is.sequential <- function(x){
 all(diff(x) == diff(x)[1])
}
2 голосов
/ 14 декабря 2011

Итак, у @Iselzer хороший ответ. Тем не менее, есть еще несколько угловых случаев: ошибки округления и начальное значение. Вот версия, которая допускает ошибки округления, но проверяет, что первое значение (почти) является целым числом.

is.sequential <- function(x, eps=1e-8) {
  if (length(x) && isTRUE(abs(x[1] - floor(x[1])) < eps)) {
     all(abs(diff(x)-1) < eps)
  } else {
    FALSE
  }
}

is.sequential(2:5) # TRUE

is.sequential(5:2) # FALSE

# Handle rounding errors?
x <- ((1:10)^0.5)^2
is.sequential(x) # TRUE

# Does the sequence need to start on an integer?
x <- c(1.5, 2.5, 3.5, 4.5)
is.sequential(x) # FALSE

# Is an empty vector a sequence?
is.sequential(numeric(0)) # FALSE

# What about NAs?
is.sequential(c(NA, 1)) # FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...