【问题标题】:Removing duplicates based on multiple conditions, including max. date根据多个条件删除重复项,包括最大值。日期
【发布时间】:2020-04-20 03:09:12
【问题描述】:

如果我的数据框看起来像这样:

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 和 Code 相同时,我想删除重复项。我想根据具有最大值的那个来删除重复项。到期日。我想要的输出是:

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"

我该如何解决这个问题?

【问题讨论】:

    标签: r duplicates max


    【解决方案1】:

    我们可以通过“ID”、“代码”和slicemax“到期日期”的行进行分组。在R中,max获取maximum值,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 DateDate 类。如果不是,应该先用as.Date转换成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")
    

    【讨论】:

      猜你喜欢
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2015-06-27
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多