2017-04-18 4 views
1

Ich habe eine Daten wie folgt, ich möchte die kumulative Zählung das Auftreten von Namen zu tun, aber die Anzahl Anzahl kann nicht zweimal im selben Jahr zählen.Wie man Faktor zählt und keine Doppelzählung im selben Jahr

mydata<- 
data.table(name=c("hon","hon","hon","acer","acer","acer","acer","acer"), 
year=c(1991,1991,1992,1981,1982,1983,1983,1983), 
count=c(1,1,2,1,2,3,3,3)) 
setDT(mydata) 

meine erste Lösung ist

aber es wird doppelt im selben Jahr zählen. Jeder Vorschlag ist willkommen. thx Fortschritt.

+2

'mydata [, mycount: = cumsum (! Dupliziert (Jahr)), durch = Name]'? –

+0

@docendodiscimus Ich wusste nicht, dass das OP die erwartete Ausgabe in "count" wollte. Wie auch immer, ich habe eine Antwort geschrieben – akrun

Antwort

0

Wir match nach dem Gruppieren von 'name' verwenden können

mydata[, mycount := match(year, unique(year)), name] 
mydata 
# name year count mycount 
#1: hon 1991  1  1 
#2: hon 1991  1  1 
#3: hon 1992  2  2 
#4: acer 1981  1  1 
#5: acer 1982  2  2 
#6: acer 1983  3  3 
#7: acer 1983  3  3 
#8: acer 1983  3  3 

Oder eine andere Möglichkeit ist, factor mit levels als unique Elemente von 'Jahr' nach der Gruppierung von 'Name' angegeben und dann in integer

konvertieren
mydata[, mycount := as.integer(factor(year, levels = unique(year))), name] 
+0

Frage, ob ich mit Null beginnen möchte, wie zeige ich es. mydata [, mycount: = mycount-1] zeigen NA @@? – changjx

+0

@changjx Einfach 1 subtrahieren '' mydata [, mycount: = Übereinstimmung (Jahr, einzigartig (Jahr)) - 1, Name] 'Für mich gibt es die erwartete Ausgabe dh' mydata $ mycount # [1] 0 0 1 0 1 2 2 2' – akrun

1

Es scheint, dass Sie eine kumulative Anzahl von verschiedenen Jahren pro Name wünschen. Um dies zu tun, können Sie duplicated auf das Jahr Spalte verwenden, negieren sie, und cumsum:

mydata[, mycount := cumsum(!duplicated(year)), by = name] 

# name year count mycount 
# 1: hon 1991  1  1 
# 2: hon 1991  1  1 
# 3: hon 1992  2  2 
# 4: acer 1981  1  1 
# 5: acer 1982  2  2 
# 6: acer 1983  3  3 
# 7: acer 1983  3  3 
# 8: acer 1983  3  3 
Verwandte Themen