2016-03-27 4 views
0

Ich habe folgende Daten:Wie eindeutige Zeilen und einzigartige Beobachtungen in einem data.frame zu identifizieren, basierend auf Zeitvariable

d <- data.frame(id=c(1,2,3,4,5,6,7), 
      year=c(1999,1999,1999,2000,2000,2000,2000), 
      var1=c(1,1,2,1,4,1,8), 
      var2=c(1,1,2,1,5,2,0), 
      var3=c(0,0,0,0,7,0,0)) 

> d 
    id year var1 var2 var3 
1 1 1999 1 1 0 
2 2 1999 1 1 0 
3 3 1999 2 2 0 
4 4 2000 1 1 0 
5 5 2000 4 5 7 
6 6 2000 1 2 0 
7 7 2000 8 0 0 

Ich mag jede Zeile der data.frame bewerten und ein Punktzahl Rückkehr in eine neue Variable namens 'comb'.

Wenn eine Zeile eine Kombination unter var1-var3 hält, die:

  • nie in den vergangenen Jahren beobachtet (aber Elemente sind) -> zuordnen comb = 1
  • enthält ein Element, das nicht gesehen wird in den vergangenen Jahren -> assign Kamm = 2
  • nie in den vergangenen Jahren beobachtet und hält ein neues Element -> assign Kamm = 3
  • in den vergangenen Jahren beobachtet -> assign Kamm = 0

Einige Nebennoten:

  • Die Reihenfolge des Auftretens keine Rolle spielt (1,1,2 == 1,2,1)
  • Doppelte Kombinationen im selben Jahr können gleich
gekennzeichnet werden

In den Beispieldaten, dies sollte wie folgt aussehen:

d2 <- data.frame(id=c(1,2,3,4,5,6,7), 
      year=c(1999,1999,1999,2000,2000,2000,2000), 
      var1=c(1,1,2,1,4,1,8), 
      var2=c(1,1,2,1,5,2,0), 
      var3=c(0,0,0,0,7,0,0), 
      comb=c(3,3,3,0,3,1,2)) 
> d2 
    id year var1 var2 var3 comb 
1 1 1999 1 1 0 3 
2 2 1999 1 1 0 3 
3 3 1999 2 2 0 3 
4 4 2000 1 1 0 0 
5 5 2000 4 5 7 3 
6 6 2000 1 2 0 1 
7 7 2000 8 0 0 2 

beachten sie, dass die zweite Reihe Kamm zugeordnet = 3, weil es das erste Jahr beobachten wir, dass combinatio ns. Wenn diese Beobachtung in Jahr = 200 (wie Zeile 4) war, wird ihr eine Null zugewiesen.

Ist das möglich? Jede Hilfe wird sehr geschätzt!

+2

In Ihrer Ausgabe scheint die zweite Zeile bereits in diesem Jahr vorhanden sein, warum ist nicht 0? – adaien

+0

Können Sie detaillierte Notizen in die Ausgabe schreiben, um zu beschreiben, wie sie aussehen soll? – InfiniteFlashChess

+0

@adiana: Ich möchte jede doppelte Beobachtung in einem bestimmten Jahr gleich kennzeichnen. –

Antwort

1

Es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun, aber hier ist eine mögliche Strategie. Erstens können Sie eine Zeichenfolge erstellen, die Kombination von var1...var3 ist, wie folgt aus:

> d2$var123 <- paste(d2$var1, d2$var2, d2$var3, sep="-") 
> d2 
    id year var1 var2 var3 var123 
1 1 1999 1 1 0 1-1-0 
2 2 1999 1 1 0 1-1-0 
3 3 1999 2 2 0 2-2-0 
4 4 2000 1 1 0 1-1-0 
5 5 2000 4 5 7 4-5-7 
6 6 2000 1 2 0 1-2-0 
7 7 2000 8 0 0 8-0-0 

An dieser Stelle können Sie einfach (1) Schleife für alle Elemente; (2) Überprüfen Sie, ob einer der var Werte in var123 oder in einer Liste aller vorherigen var1...var3 Spalten auftritt, und weisen Sie dann Ihren comb Wert entsprechend zu. Hier ist ein bisschen von Pseudocode:

d2$comb <- 0 # Initialize column 
for (i in unique(d2$id)) { 
    previous <- subset(d2, d2$id < i) # All the years before 
    current <- subset(d2, d2$id == i) # The current row 
    previous_vals <- unique(c(previous$var1, previous$var2, previous$var3)) 
    previous_combos <- unique(previous$var123) 

    if (i$var1 %in% previous_vals | i$var1 %in% previous_vals...) { 
     d2$comb([d2$id==1] <- 1 
    } 
    if (i$var123) %in% previous_combos { 
     d2$comb[d2$id==i] <- 0 
    } 
    .... # Rest of conditions here 
} 
+1

'vorherige' ist nicht nur' Teilmenge (d2, d2 $ id adaien

+1

Ich sehe.Vielleicht könnte "vorhergehende" als "Teilmenge" definiert werden (d2, d2 $ Jahr <= aktuelles $ Jahr & d2 $ id! = Aktuelle $ ID) '. Auf diese Weise können wir alle Jahre auf "aktuell" bringen, aber "aktuell" ausschließen. –