2016-03-31 16 views
0

Ich habe folgende Datenrahmen (zB Daten), die die Daten von verschiedenen DVD-Aufnahmen für verschiedene Vogelpaare für zahlreiche Bruten hat:Erstellen einer Rang Spalte basiert auf zwei anderen (verlinkten) Spalten in R

PairID BroodRef DVDdate 
1  512  2004-05-22 
1  512  2004-05-30 
1  512  2004-05-26 
1  588  2004-06-30 
1  588  2004-07-04 
1  588  2004-07-09 
2  673  2004-07-19 
3  543  2004-06-03 
3  543  2004-06-07 
3  543  2004-06-11 
3  620  2004-07-19 
3   39  2005-05-19 
3   39  2005-05-23 

Was ich möchte, ist eine Brutnummer für jedes Paar, wie zum Beispiel:

PairID BroodRef DVDdate BroodNumber 
1  512  2004-05-22  1 
1  512  2004-05-30  1 
1  512  2004-05-26  1 
1  588  2004-06-30  2 
1  588  2004-07-04  2 
1  588  2004-07-09  2 
2  673  2004-07-19  1 
3  543  2004-06-03  1 
3  543  2004-06-07  1 
3  543  2004-06-11  1 
3  620  2004-07-19  2 
3   39  2005-05-19  3 
3   39  2005-05-23  3 

I

ddply(df,.(PairID),transform,BroodNumber = dense_rank(BroodRef)) 

versucht haben, die Ich sah auf einer anderen Frage, aber das ergibt Paar 3, BroodRef 39 BroodNumber 1 und nicht die 3, die es sein sollte.

Schätzen Sie jede Hilfe!

+0

Wie wird diese Brut Zahl berechnet? Es scheint, dass es eine bestimmte Domäne gibt, die domänenspezifisch ist. Kannst du das bitte klären? – bouncyball

+0

Ich möchte, dass die BroodNumber berechnet wird, indem die Daten in Paare aufgeteilt werden und dann die BroodRefs in aufsteigender Reihenfolge sortiert werden (nicht durch aufsteigende BroodRef-Bestellung). Dann wäre der erste Satz identischer BroodRefs Nummer 1, nächster Satz Nummer 2 usw., bis sich die PairID ändert. –

Antwort

1

Wir verwenden dplyr

library(dplyr) 
df1 %>% 
    group_by(PairID) %>% 
    mutate(BroodNumber = match(BroodRef, unique(BroodRef))) 
# PairID BroodRef DVDdate BroodNumber 
# (int) (int)  (chr)  (int) 
#1  1  512 2004-05-22   1 
#2  1  512 2004-05-30   1 
#3  1  512 2004-05-26   1 
#4  1  588 2004-06-30   2 
#5  1  588 2004-07-04   2 
#6  1  588 2004-07-09   2 
#7  2  673 2004-07-19   1 
#8  3  543 2004-06-03   1 
#9  3  543 2004-06-07   1 
#10  3  543 2004-06-11   1 
#11  3  620 2004-07-19   2 
#12  3  39 2005-05-19   3 
#13  3  39 2005-05-23   3 
2

Wir könnten rleid() von data.table verwenden, um eine Sequenz basierend auf BroodRef, gruppiert von PairID zu erstellen.

library(data.table) 
setDT(df)[,BroodNumber := rleid(BroodRef), by = PairID] 
# PairID BroodRef DVDdate BroodNumber 
# 1:  1  512 2004-05-22   1 
# 2:  1  512 2004-05-30   1 
# 3:  1  512 2004-05-26   1 
# 4:  1  588 2004-06-30   2 
# 5:  1  588 2004-07-04   2 
# 6:  1  588 2004-07-09   2 
# 7:  2  673 2004-07-19   1 
# 8:  3  543 2004-06-03   1 
# 9:  3  543 2004-06-07   1 
#10:  3  543 2004-06-11   1 
#11:  3  620 2004-07-19   2 
#12:  3  39 2005-05-19   3 
#13:  3  39 2005-05-23   3 
Verwandte Themen