Подтвердить что ты не робот

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

Итак, у меня есть набор данных в 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

Я хочу удалить все экземпляры, кроме экземпляра LAST идентификатора сообщения. Сейчас все, что я могу найти в Интернете, и функции, которые я использую, - это удаление всего, кроме экземпляра FIRST.

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

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

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

Медведь со мной Я новичок в R:)

4b9b3361

Ответ 1

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

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

Ответ 2

Разве это не было бы стандартным случаем использования параметра 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, потому что он позволяет легко получить доступ к набору дополнений, если вы сравниваете группы.

Ответ 3

Используя объединение 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']

Ответ 4

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

data <- data %>%
  group_by(ID) %>%
  slice(which.max(Tally))