Удалить все дубликаты, кроме последнего

Итак, у меня есть набор данных в R со следующим макетом в качестве примера:

ID Date Tally
1 2/1/2011 1
2 2/1/2011 2
3 2/1/2011 3
1 2/1/2011 4
2 2/1/2011 5
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9

Я хочу удалить все экземпляры, кроме ПОСЛЕДНЕГО экземпляра идентификатора записи. Прямо сейчас все, что я могу найти в Интернете, и функции, которые я использую, - это удаление всего, кроме ПЕРВОГО экземпляра.

Так что мой новый фрейм данных будет выглядеть так:

ID Date Tally
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9

Как мне это сделать? Прямо сейчас я могу сохранить только первый экземпляр. Я хочу сделать это наоборот? Любая помощь?

Терпите меня, я новичок в R:)

4 ответа

Решение

Использование !rev(duplicated(rev(ID))) отфильтровать все, кроме последних уникальных вхождений.

Чтобы отфильтровать набор данных, используйте dataset[!rev(duplicated(rev(dataset$ID))),]

Не будет ли это просто стандартным случаем использования параметра fromLast для duplicated?

 dat[ !duplicated(dat[, c("ID", "Date")], fromLast=T),]
#---------
  ID     Date Tally
6  1 2/1/2011     6
7  3 2/1/2011     7
8  4 2/1/2011     8
9  2 2/1/2011     9

Ваш пример был недостаточно богат, чтобы определить, нужен ли вам столбец "Дата" в тесте на дублирование, так что, возможно, вы могли бы упростить. Я оставляю это, чтобы проиллюстрировать это duplicated имеет метод data.frame. я предпочитаю !duplicated в unique потому что это позволяет легкий доступ к дополнению набора, если вы сравниваете группы.

Используя data.table присоединиться, вы можете установить mult = 'last'

Например

library(data.table)
DT <- data.table(DF, key = 'id')

# join with the unique ID values
DT[unique(DT[,list(ID)]), mult= 'last']

   ID     Date Tally
1:  1 2/1/2011     6
2:  2 2/1/2011     9
3:  3 2/1/2011     7
4:  4 2/1/2011     8

Если бы вы знали уникальные идентификаторы, вы могли бы также любой из следующих

DT[.(1:4), mult='last']
DT[list(1:4), mult = 'last']

Используйте dplyr:

data <- data %>%
  group_by(ID) %>%
  slice(which.max(Tally))
Другие вопросы по тегам