#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