сравнить текущую ячейку и предыдущую ячейку в стиле Excel без цикла

#r

#r

Вопрос:

Я хочу создать индикаторную переменную после сравнения текущего значения переменной и предыдущего значения. Логика такая: if current value= previous value, then indicator =1,else 0 . Первое значение индикатора усекается, поскольку сравнение отсутствует. Это должно быть быстро, потому что у меня есть много групп для сравнения в моих данных (я не включил группу для простоты)

 > dt<-c('a','a','a','b','a','a','c','c') 
>  indicator
 [1] NA  1  1  0  0  1  0  1
  

Ответ №1:

Используя базу R, вы можете удалить последние элементы и первый элемент вектора с head() помощью и tail() и выполнить сравнение, а затем добавить NA в начало.

 c(NA, as.numeric(head(dt, -1) == tail(dt, -1)))
  

Если dt бы это был вектор чисел, вы могли бы использовать diff как

 dn <- c(1,1,1,2,1,1,3,3)
c(NA, (diff(dn)==0) 0)
  

(используя 0 вместо as.numeric того, чтобы делать логические значения 1 и 0.)

Ответ №2:

Вы можете использовать Lag из Hmisc пакета

Игнорирование первого значения с [-1] и добавление NA в начале.

 library(Hmisc)
c(NA, as.numeric(dt== Lag(dt))[-1])

#[1] NA  1  1  0  0  1  0  1
  

Ответ №3:

Вы также можете использовать rle в базовом R:

 v <- rle(dt)[[1]]
x <- rep(1:length(v),v)
indicator <- c(NA, (diff(x)==0)*1)

#[1] NA  1  1  0  0  1  0  1
  
  • v : возвращает количество повторений каждого символа
  • x : содержит соответствующий числовой вектор от dt , чтобы извлечь выгоду из diff