2016-03-31 3 views
0

У меня есть следующие dataframe (пример данных), который имеет даты различных записей DVD для различных пар птиц для многочисленных выводков:Создание столбца ранга на основе двух других (связанных) столбцов в 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 

То, что я хотел бы это выводок номер для каждой пары, такие как:

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 

Я попытался

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

который Я видел еще один вопрос, но это приводит к тому, что пара 3, BroodRef 39 является BroodNumber 1, а не 3, она должна быть.

Цените любую помощь!

+0

Как это выводок номер вычисленного? Похоже, есть некоторая терминология, которая является доменной спецификой. Не могли бы вы прояснить? – bouncyball

+0

Я бы хотел, чтобы BroodNumber рассчитывался путем разделения данных на пары, а затем заказа BroodRefs в порядке возрастания даты (не по возрастанию порядка BroodRef). Тогда первый набор идентичных BroodRefs будет номером 1, следующим номером набора 2 и так далее до тех пор, пока PairID не изменится. –

ответ

1

Мы можем использовать 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

Мы можем использовать rleid() от data.table для создания последовательности на основе BroodRef, сгруппированной по PairID.

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 
Смежные вопросы