R 基于多个条件(包括最长日期)删除重复项

R 基于多个条件(包括最长日期)删除重复项,r,duplicates,max,R,Duplicates,Max,如果我看到如下所示的数据帧: 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

如果我看到如下所示的数据帧:

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"))]),]

如何解决此问题?

我们可以通过“ID”、“代码”和“切片”对带有max“到期日期”的行进行分组。在
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   
注意:
base R
中没有名为
MAX
的函数。它是
max
。此外,我们假设
到期日
日期
类。如果不是,则应首先将其转换为带有
as.Date


base R
中,我们可以基于“到期日”执行
订单
,然后使用
复制的

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

data1我们可以通过“ID”、“code”和
slice
对带有
max
过期日期的行进行分组。在
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   
注意:
base R
中没有名为
MAX
的函数。它是
max
。此外,我们假设
到期日
日期
类。如果不是,则应首先将其转换为带有
as.Date


base R
中,我们可以基于“到期日”执行
订单
,然后使用
复制的

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
data1
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")