2013-11-18 5 views
2
id=c(2,3, 3, 4, 4, 4, 5, 6, 7, 8, 8) 
DateofCall=as.Date(c("2013-03-22", "2013-05-25", "2013-02-17", "2013-02-19", "2013-02- 21", "2013-04-22", "2013-06-22", "2013-03-28", "2013-08-22", "2013-03-18", "2012-12-28")) 
mydata <- data.frame(id, DateofCall) 

Я хочу, чтобы новый кадр данных, где только наблюдения для тех дублирующих кодов с последней датой остаются, как это:Удалить дубликаты на основе даты

id=c(2,3, 4, 5, 6, 7, 8) 
DateofCall=as.Date(c("2013-03-22", "2013-05-25", "2013-04-22", "2013-06-22", "2013-03- 28", "2013-08-22", "2013-03-18")) 
newdata <- data.frame(id, DateofCall) 

Я пытался использовать это, но получает сообщение об ошибке: test=mydata[!((duplicated(mydata$id) & max(mydata$DateofCall))), ] Есть ли альтернатива max() для переменных даты?

Любое понимание?

ответ

4
aggregate(DateofCall ~ id, mydata, max) 

будет делать трюк.

# id DateofCall 
# 1 2 2013-03-22 
# 2 3 2013-05-25 
# 3 4 2013-04-22 
# 4 5 2013-06-22 
# 5 6 2013-03-28 
# 6 7 2013-08-22 
# 7 8 2013-03-18 

Update

Эта версия поддерживает любое количество дополнительных столбцов:

subset(mydata, ave(DateofCall, id, FUN = max) == DateofCall) 
+0

+1 конечно ...! –

+0

@Sven - Могу ли я использовать команду aggregate для подмножества данных, чтобы просто включать уникальные идентификаторы с последними датами? На самом деле, мой набор данных имеет больше, чем Id и DateofCall в качестве переменных. – Tan

+0

@Tan См. Обновление. –

Смежные вопросы