Ответ 1
Используйте !rev(duplicated(rev(ID)))
для фильтрации всех, кроме последних уникальных вхождений.
Чтобы получить фильтрацию данных, используйте dataset[!rev(duplicated(rev(dataset$ID))),]
Итак, у меня есть набор данных в 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:)
Используйте !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))