Как определить, равны ли два или более непрерывных элемента вектора в R - PullRequest
0 голосов
/ 25 августа 2018

Я хочу найти способ определить, равны ли два или более непрерывных элемента вектора.

Например, в векторе x=c(1,1,1,2,3,1,3) первый, второй и третий элементы равны.

С помощью следующей команды я могу определить, содержит ли вектор, скажем, y, два или более непрерывных элемента, равных 2 или 3

all(rle(y)$lengths[which( rle(y)$values==2 | rle(y)$values==3 )]==1)

Есть ли другой способ быстрее?

EDIT

Допустим, у нас есть вектор z=c(1,1,2,1,2,2,3,2,3,3). Я хочу вектор с тремя элементами в качестве вывода. Первый элемент будет ссылаться на значение 1, второй на 2, а третий на 3. Значения элементов выходного вектора будут равны 1, если два или более непрерывных элемента z одинаковы для одного значения 1,2,3 и 0 в противном случае. Итак, выход для вектора z будет (1,1,1).

Для вектора w=c(1,1,2,3,2,3,1) выходное значение будет 1,0,0, поскольку только для значения 1 есть два непрерывных элемента, то есть в первом и во втором положении w.

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Я не совсем уверен, понимаю ли я твой вопрос, так как он мог бы быть сформулирован лучше. Первая часть просто спрашивает, как вы находите, равны ли непрерывные элементы в векторе. Ответ заключается в использовании функции diff() в сочетании с проверкой на нулевую разницу:

z <- c(1,1,2,1,2,2,3,2,3,3)
sort(unique(z[which(diff(z) == 0)]))
# [1] 1 2 3

w <- c(1,1,2,3,2,3,1) 
sort(unique(w[which(diff(w) == 0)]))
# [1] 1

Но ваш пример редактирования, кажется, подразумевает, что вы смотрите, есть ли повторяющиеся единицы в векторе, из которых будут только целые числа 1, 2 или 3. Выходными данными всегда будут X, Y, Z, где

Х равен 1, если повторяется хотя бы одна «1», иначе 0

Y равно 2, если повторяется хотя бы один «2», иначе 0

Z равно 3, если повторяется хотя бы одна "3", иначе 0

Это правильно?

Если это так, см. Следующее

continuously <- function(x){
  s <- sort(unique(x[which(diff(x) == 0)]))
  output <- c(0,0,0)
  output[s] <- s
  return(output)
}

continuously(z)
# [1] 1 2 3
continuously(w)
# [1] 1 0 0
0 голосов
/ 25 августа 2018

Если ваша серия называется z=c(1,1,2,1,2,2,3,2,3,3), вы можете сделать:

(unique(z[c(FALSE, diff(z) == 0)]) >= 0)+0, который будет выводить до 1, 1, 1,

Когда вы запускаете указанную выше команду на другой вашей последовательности:

w=c(1,1,2,3,2,3,1)

, затем (unique(w[c(FALSE, diff(w) == 0)]) >= 0)+0 вернется к 1

Вы также можете попробовать это для точного вывода, как 1,1,1 или 1,0,0

(unique(z[c(FALSE, diff(z) == 0)]) == unique(z))+0 #1,1,1 for z and 1,0,0 for w

Логика:

Команда

diff примет разницу между соответствующими вторыми и предыдущими элементами, так как общая разница всегда будет на 1 меньше, чем количество элементов, я добавил первый элемент как FALSE. Затем подмножество ваших исходных последовательностей и для логического сравнения, равна ли возвращенная разница нулю или нет Наконец, мы конвертируем их в 1, спрашивая, больше ли они или равны 0 (Чтобы получить серии 1, вы можете также проверить это с некоторыми другими условиями, чтобы получить 1).

Предполагая, что в вашей последовательности нет отрицательных чисел.

...