Удаление дубликатов на основе нескольких условий, в том числе макс. свидание - PullRequest
1 голос
/ 19 апреля 2020

Если у меня фрейм данных, который выглядит так:

ID  Code  Desc.  Expiry Date
1   2C    Long   2018-02-01
1   2C    Long   2020-02-01
2   NA    Tall   2019-04-30
2   NA    Tall   2016-04-28

Я хочу удалить дубликаты, когда ID и код совпадают. Я хочу удалить дубликаты в зависимости от того, какой из них имеет максимум. срок годности. Вывод, который мне нужен, будет:

ID  Code  Desc.  Expiry Date
1   2C    Long   2020-02-01
2   NA    Tall   2019-04-30

Я пробовал

data <- data[!duplicated(data[c("ID", "CODE", MAX("Expiry Date"))]),]

Но это приводит к

could not find function "MAX"

Как я могу это исправить?

1 Ответ

0 голосов
/ 19 апреля 2020

Мы можем сделать группу по 'ID', 'Code' и slice строке с max 'Expiry Date'. В R, max получает значение max imum, which.max индекс максимального значения

library(dplyr)
data %>%
    group_by(ID, Code) %>%
    slice(which.max(`Expiry Date`))
# A tibble: 2 x 4
# Groups:   ID, Code [2]
#     ID Code  Desc. `Expiry Date`
#  <int> <chr> <chr> <date>       
#1     1 2C    Long  2020-02-01   
#2     2 <NA>  Tall  2019-04-30   

Или с data.table

library(data.table)
setDT(data)[, .SD[which.max(`Expiry Date`)], .(ID, Code)]

ПРИМЕЧАНИЕ. В base R нет функции с именем MAX. Это max. Кроме того, мы принимаем Expiry Date как Date класс. Если нет, его сначала нужно преобразовать в Date класс с as.Date


В base R, мы можем сделать order на основе «даты истечения» и затем использовать duplicated

data1 <- data[do.call(order, data[c('ID', 'Code', 'Expiry Date')]),]
data1[!duplicated(data1[c('ID', 'Code')], fromLast = TRUE),]
#  ID Code Desc. Expiry Date
#2  1   2C  Long  2020-02-01
#3  2 <NA>  Tall  2019-04-30

данные

data <- structure(list(ID = c(1L, 1L, 2L, 2L), Code = c("2C", "2C", NA, 
NA), Desc. = c("Long", "Long", "Tall", "Tall"), 
`Expiry Date` = structure(c(17563, 
18293, 18016, 16919), class = "Date")), row.names = c(NA, -4L
), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...