Векторный анализ в R - PullRequest
0 голосов
/ 11 ноября 2018

В качестве входных данных ваша функция должна принимать вектор 0 и 1; Каждый раз, когда вы видите последовательность 1 с в данных, вам нужно увеличить количество детей на 1; Будьте осторожны с двумя последующими последовательностями 1, где разница между ними меньше 5 (т. Е. Если между ними меньше 5 0, то это один и тот же дочерний элемент, а не новый дочерний элемент); Чтобы помочь вам, социальный планировщик приводит несколько примеров того, что ваша функция должна возвращать:

#Input: c(1,1,1,1,0,0,0,0)

#Output: 1 1 1 1 1 1 1 1

#Input: c(0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1)

#Output: 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2

#Input: c(0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,1)

#Output: 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2

Функции, которые могут быть полезны: diff() cumsum() which() rle()

Я не совсем понимаю, как подойти к вопросу, мои мысли по этому поводу используют функцию diff после cumsum, поскольку это поможет мне выдержать ряд 1 с, но в этом сценарии я теряю длину вектора (это, очевидно, становится короче) также #rle$lenght, кажется, помогает мне обнаружить пробелы длиной 5 или более, чтобы превратить 1 с в 2 с. Извините за этот вопрос я только начинающий

1 Ответ

0 голосов
/ 12 ноября 2018

Я использую какую функцию в r (https://www.r -bloggers.com / which-function-in-r / ) и кодировку длины прогона (http://www.cookbook -r.com / Manipulating_data / Finding_sequences_of_identical_values ​​/ ). Вот моя попытка:

vector_analyse <- function(sample_vector){
  # ----------------------------------------------------------------------------
  # Signature: vector --> vector
  # Author: kon_u
  # Description: Given a sample vector of 0s and 1s, return a sequence of 1s in 
  # the data you need to increase the number of children by 1 (when there are less 
  # 5 0s in between them, then it is the same child and not a new child)
  # ----------------------------------------------------------------------------

  # ----------------------------------------------------------------------------
  # Run Length Encoding gives a list of length and values
  # ----------------------------------------------------------------------------
  rle_object <- rle(sample_vector)
  x <- rle_object$lengths # original length 
  y <- rle_object$values # original values
  z <- which(y == 1) # index of 1 in vector y
  if (length(z) == 1){
    invisible()
  } else{
    for (i in 2:length(z)){
      if (x[z[i]-1] >= 5){
        y[z[i]] = y[z[i]]
      } else {
        y[z[i]] = y[z[i]] - 1
      }
    }
  }
  y_cumsum = cumsum(y)
  rle_object$values <- y_cumsum
  new_vector = inverse.rle(rle_object)
  return(new_vector)
}

vector_analyse(c(1,1,1,1,0,0,0,0)) # 1 1 1 1 1 1 1 1
vector_analyse(c(0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1)) # 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2
vector_analyse(c(0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,1)) # 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...