【问题标题】:Removing Duplicates from one Column based on conditions of another in R根据R中另一列的条件从一列中删除重复项
【发布时间】:2021-09-09 04:24:41
【问题描述】:

我有一个数据集,我试图按订单周期计算留存客户的数量,但在数据集中,由于同一客户在多个时间段内订购的订单有很多重复,因此它们被包含为数据集中的新条目(观察)。不幸的是,其中许多包含重复的 ID/人员编号,所以我想知道是否有任何类型的正则表达式或过滤器可以使用来检查 retained 列,然后删除重复的 ID/人员编号,如果retained中的值是一样的。

tibble::tribble(
                    ~PERSONUM,      ~ID, ~ORDER_PERIOD, ~retained,
                  10001685, 10109887,         "201750",       "Y",
                  10001685, 10109887,         "201850",       "Y",
                  10001685, 10109887,         "201950",       "Y",
                  10005733, 10162571,         "201550",       "Y",
                  10005787, 10112896,         "201550",       "Y",
                  10005795, 10112901,         "201550",       "Y",
                  10005795, 10112901,         "201650",       "Y",
                  10005795, 10112901,         "201750",       "Y",
                  10020043, 10156305,         "202050",       "Y",
                  10020165, 10122910,         "201750",       "Y",
                  10020165, 10122910,         "201850",       "Y",
                  10020649, 10123585,         "201550",       "N",
                  10028842, 10128545,         "201750",       "Y",
                  52300090, 10147580,         "201850",       "N",
                  52300740, 10149860,         "201650",       "N",
                  52300749, 10135925,         "201750",       "Y",
                  52300749, 10135925,         "201850",       "Y",
                  52300917, 10140173,         "201650",       "Y",
                  52300917, 10140173,         "201750",       "Y",
                  52300917, 10140173,         "201850",       "Y"
                  )

我正在考虑使用 df %>% filter(ID==ID) 但显然 ID 将始终等于自身,我知道有重复的函数,我考虑过使用类似的东西

df_cleaned <-df[!duplicated(df),]

但我需要代码来应用某种首先查看保留列的条件。

【问题讨论】:

    标签: r duplicates conditional-statements


    【解决方案1】:

    您可以使用 dplyr

    中的 distinct 功能
    df_cleaned <- df %>% distinct(PERSONUM, retained,.keep_all=TRUE)
    

    上面的代码保存了具有不同“PERSONNUM”和“retained”值的记录

    【讨论】:

    • 是 .keep_all 参数指定的吗?谢谢,乍一看,它似乎工作!现在,您知道这是否适用于不止一列吗?如果说,我有一个保留变量,可能还有另一列说明客户是新客户还是老客户?
    • @BenjaminDiaz 是的,它也适用于多个“一个”列。您只需将其添加到函数内部,例如“distinct(PERSONNUM, reserved,, .keep_all=TRUE)”
    • .keep_all 参数指定将保留(不删除)函数内部未指定的其他列(如 ID 或 ORDER_PERIOD)
    【解决方案2】:

    也许下面的代码可以满足问题的要求。
    它按IDretained 分组,然后只保留每组的第一行,消除重复项。

    library(dplyr)
    
    orders %>%
      group_by(ID, retained) %>%
      filter(row_number() == first(row_number()))
    

    注意

    DDT's answer 更简单,该代码和上面代码的结果是identical 在上面ungroup 之后:

    orders %>%
      group_by(ID, retained) %>%
      filter(row_number() == first(row_number())) %>%
      ungroup() -> df1
    
    orders %>% distinct(ID, retained, .keep_all = TRUE) -> df2
    
    identical(df1, df2)
    #[1] TRUE
    

    【讨论】:

    • 现在,只是好奇,您为什么要在管道末端取消分组?此外,这对于在列中可能具有不同数据但 ID 相同的多行是否足够强大?
    • @BenjaminDiaz 让identical 工作。没有它,结果将有一个属性attr(*, "groups")
    • 谢谢!我也支持你,因为我喜欢你的第二个解决方案。虽然,我给了@DDT 的“答案”
    • @BenjaminDiaz 是的,这就是最后一个注释的重点。一个更简单且相同的答案会更好。感谢您的支持。
    猜你喜欢
    • 2018-12-01
    • 2014-07-23
    • 1970-01-01
    • 2021-12-02
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    相关资源
    最近更新 更多