Как сопоставить значение в векторе со значением до и после в r? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь определить несоответствующие значения на основе одного значения элемента до или после фокусного значения в векторе. Есть мысли о том, как это сделать?

Допустим, у меня есть вектор: x<-c(1,1,2,1,3,3). Если element[i] соответствует элементу до или после элемента i (element[i-1] и element[i+1]). Если есть совпадение, element[i] должно равняться «да», в противном случае оно должно равняться «нет».

Ожидаемый результат для x<-c(1,1,2,1,3,3) должен быть c("yes","yes","no","no","yes","yes").

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Используйте rle() для определения прогонов равных значений. rle(x)$length == 1 означает, что нет равных значений до или после текущего.

rep(ifelse((len <- rle(x)$lengths) == 1, "no", "yes"), len)
# [1] "yes" "yes" "no"  "no"  "yes" "yes"

Редактировать: более краткая версия (спасибо за @ dww's комментарий)

rep((len <- rle(x)$lengths) == 1, len)
# [1] FALSE FALSE  TRUE  TRUE FALSE FALSE
0 голосов
/ 10 января 2019

Вот один из способов сделать это (используя TRUE и FALSE вместо "yes" и "no"). Объяснение в комментариях.

pre_or_post_matches <- function(vec){
  # get length of `vec`, create empty return vector `out` that we fill
  len <- length(vec)
  out <- rep(NA, len)
  # first element: just check if it equals the second 
  out[1] <- vec[1]==vec[2]
  # last element: just check if it equals the second to last 
  out[len] <- vec[len]==vec[len-1]
  # the other elements: check if equal to at least one neighbor 
  for (idx in 2:(len-1)){
    out[idx] <- (vec[idx]==vec[idx-1]) | (vec[idx]==vec[idx+1])
  }
  return(out)
}


# apply func to example data provided by OP 
x <- c(1, 1, 2, 1, 3, 3)

pre_or_post_matches(x)
## [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE
0 голосов
/ 10 января 2019

Один вкладыш для этого должен использовать diff

c(diff(x) == 0, F) | c(F, diff(x) == 0)
[1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE

c(diff(x) == 0, F) будет истинным для каждого индекса с элементом [i] == элементом [i + 1] (неприменимо для последнего элемента), а c(F, diff(x) == 0) будет истинным для каждого индекса с элементом [i] == элементом [i-1] (неприменимо для первого элемента)

0 голосов
/ 10 января 2019

Вот один базовый подход R. Мы можем сгенерировать смещенные векторы, либо на одну позицию слева, либо на одну позицию справа от исходного входного вектора. Затем мы можем утверждать, совпадает ли каждая позиция в исходном векторе с одной и той же позицией в смещенных векторах. Для визуализации:

x:  [ 1, 1, 2, 1, 3, 3]
------------------------
x1: [NA, 1, 1, 2, 1, 3]
x2: [ 1, 2, 1, 3, 3, NA]

Мы можем увидеть результат, который вы ожидаете, по результатам осмотра. Вот фрагмент кода, реализующий это:

x <- as.character(c(1,1,2,1,NA,NA))
x1 <- c('NA', x[1:length(x)-1])
x2 <- c(x[2:length(x)], 'NA')
result <- (x==x1 | is.na(x) & is.na(x1) | x==x2 | is.na(x) & is.na(x2))
output <- ifelse(is.na(result) | !result, "no", "yes")
output

[1] "yes" "yes" "no"  "no"  "yes" "yes"

Обратите внимание, что я намеренно преобразовал ваш числовой вектор в символьный вектор, чтобы я мог использовать 'NA', строковый литерал, в качестве заполнителя для пропущенного значения. Если бы мы использовали вышеупомянутую логику с числовым вектором, NA может столкнуться с фактическими пропущенными значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...