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