Эффективно определить элементы вектора, окруженные тем же значением, что и элемент - PullRequest
0 голосов
/ 08 февраля 2019

Кажется, я не могу правильно сформулировать название.

Вот краткий пример, показывающий ожидаемый результат!Я могу решить проблему сам, как вы можете видеть, но код очень неэффективен, когда вектор большой, я чувствую.Есть ли более умный способ (есть наверняка)?

input_data=c(1,1,1,3,5,5,5,10,10,10,10,11,15,15,15,15,15,8,9)

expected_result=rep(TRUE,length(input_data))

for (k in 1:(length(input_data)-2)) {
  if (input_data[k]==input_data[k+1] & input_data[k+1]==input_data[k+2]) {
    expected_result[k+1]=FALSE
  }
}
print(expected_result)

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Векторные решения,

n <- length(input_data)
v0 <- input_data[1:(n-2)]
v1 <- input_data[2:(n-1)]
v2 <- input_data[3:n]
expected_result <- c(TRUE,!((v0==v1)&(v1==v2)),TRUE)

и, чтобы действительно минимизировать,

n <- length(input_data)
expected_result <- c(TRUE,!((diff(input_data[-n])==0)&(diff(input_data[-1])==0)),TRUE)

Обратите внимание, что вы на самом деле никогда не проверяете, нужно ли первое или последнее значение обновлять с начального TRUE,так что TRUE s дополняется на обоих концах.

0 голосов
/ 08 февраля 2019

data.table подход

код

library( data.table )
data.table( input = input_data )[, output := ifelse( input == shift( input, type = "lead", fill = FALSE) & input == shift( input, type = "lag", fill = FALSE), TRUE, FALSE)][[2]]

выход

#[1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE

функциональность

создать data.table из вектора input_data.
проверить, равны ли предыдущее и следующее значение текущему значению (с использованием shift).
заполнить пропущенные значения (сначалаи последнее) как ЛОЖЬ, если предыдущий и следующий совпадают с курсором, результат = ИСТИНА, иначе - ЛОЖЬ.
записать результат в новый столбец с именами output
[[2]] - экспортировать вновь созданные выходные данныестолбец как вектор.

...