2016-10-13 2 views
0

Ich möchte eine Indikatorvariable erstellen, nachdem ich den aktuellen Wert einer Variablen und den vorherigen Wert verglichen habe. Die Logik ist wie folgt: if current value= previous value, then indicator =1,else 0. Der erste Indikatorwert wird abgeschnitten, da kein Vergleich erfolgt. Es muss schnell sein, weil ich viele Gruppen haben in meiner Daten vergleichen (I umfassen nicht die Gruppe der Einfachheit halber)aktuelle Zelle und vorherige Zelle im Excel-Stil ohne Schleife vergleichen

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

Antwort

1

Mit Base R Sie die letzten Elemente und das erste Element des Vektors mit head() und tail() und machen den Vergleich, dann die NA nach vorne entfernen.

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

Wenn dt ein Vektor von Zahlen, so könnte man diff wie

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

verwenden (mit +0 anstatt as.numeric, um die booleans zu machen 1 und 0).

1

Sie Lag von Hmisc Paket

können

den ersten Wert Ignoriert mit [-1] und am Anfang NA hinzufügen.

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

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

Sie könnten auch verwenden rle in der Basis 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: Ruft die Anzahl der Male jedes Zeichen wiederholt
  • x: enthält die jeweiligen Zahlenvektor von dt von diff profitieren
Verwandte Themen