R ifelse откачивает НС - PullRequest
       5

R ifelse откачивает НС

3 голосов
/ 29 марта 2020

Я пытаюсь посчитать «куски» одинаковых последовательных чисел в векторе. Но мой код выдает «NA», когда я ожидаю, что он вводит либо «1», либо «0»

x <- c(1,1,0,1,1,1,0,0,1)
y <- c(0)

turing <- function(x){
  y <- c(0)
  for (i in length(x)){
    ifelse(isTRUE(x[i] == x[i+1]), y[i]<-0, y[i]<-1)
  }
  y
}
turing(x)

Это выплевывает [1] 0 NA NA NA NA NA NA NA 1

РЕДАКТИРОВАТЬ : Кажется, работает следующее:

turing <- function(x){
  y <-  numeric(length(x))
  for (i in seq_along(x)){
    ifelse(isTRUE(x[i] == x[i+1]), y[i] <-0 , y[i] <- 1)
  }
  y
}

Как выплевывает 0 1 1 0 0 1 0 1 1 Спасибо!

Ответы [ 3 ]

3 голосов
/ 29 марта 2020

Возможно, это работает для вас:

x <- c(1,1,0,1,1,1,0,0,1)
y <- c(0)

turing <- function(x){
  j<- 1
  for (i in x){
    y[j] <- ifelse((x[j] == x[j+1]), 0, 1)
    j <- j+1
  }
  y
}
turing(x)

Спасибо за указание на предыдущую ошибку @ akrun

3 голосов
/ 29 марта 2020

Я добавлю еще один ответ, так как все предыдущие ответы упустили эту классную вещь с функцией ifelse, это то, что я работаю над всем вектором, поэтому вам не нужно ничего для l oop и индекса

turing <- function(x){
  ifelse(x[1:length(x)-1] == x[2:length(x)], 0,1)
}
turing(x)

Вы также можете использовать функцию lead из пакета dplyr, чтобы сделать ее немного более чистой

ifelse(x == dplyr::lead(x), 0,1)

Надеюсь, это поможет !!

3 голосов
/ 29 марта 2020

Если нам нужна последовательность подсчета, можно использовать rleid из data.table

library(data.table)
rleid(x)

или rle из base R

with(rle(x), rep(seq_along(values), lengths))

С помощью кода OP можно предварительно назначить 'y' в качестве вектора с length, равным длине x, затем l oop по последовательности 'x' (вместо 'length', поскольку длина равна одно число), затем do if/else (ifelse - векторизованный вариант, и, поскольку мы делаем это в al *, требуется только 1020 * if/else)

turing <- function(x){
    y <-  numeric(length(x))
    for (i in seq_along(x)){
    if(i < length(x)) {
      if(x[i] == x[i+1]) {
        y[i]<-0
        } else y[i]<-1
    }}
    y[length(y)] <- 1

    y
  }

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