根据R中的3列删除重复项

时间:2016-10-11 20:37:25

标签: r sorting duplicates

我的数据集为300k +个案例,客户ID可能会重复多次。每个客户也有与之相关的日期和等级。我希望能够只保留按日期排序的唯一客户ID,然后如果存在重复的ID,其重复日期将按排名排序(保持排名最接近1)。我的数据示例如下:

Customer.ID  Date     Rank
576293     11/16/2015   6
581252     1/4/2016     5
581600     1/12/2015    2
582560     4/13/2016    1
591674     3/21/2012    6
586334     3/30/2014    1

理想的结果就是这样:

var forInts = new NumberFormat();
var forFractions = new NumberFormat();

forFractions.minimumFractionDigits = 2;
forFractions.maximumFractionDigits = 2;

format(num n) => 
    n == n.truncate() ? forInts.format(n) : forFractions.format(n);

print(format(15.50));
print(format(15.0));

1 个答案:

答案 0 :(得分:1)

明确了OP的所需输出:

我们也可以使用基数R执行此操作,这将比使用dplyr的{​​{1}}方法更快,因为我们不必循环遍历所有唯一group_by(Customer.ID):< / p>

Customer.ID

注意:

  1. 首先,按升序排序df <- df[order(-df$Customer.ID,as.Date(df$Date, format="%m/%d/%Y"),-df$Rank, decreasing=TRUE),] res <- df[!duplicated(df$Customer.ID),] ,然后按降序排列Customer.ID,然后按升序排序Date
  2. 删除Rank中的重复项,以便只保留每个Customer.ID的第一行。
  3. 结果使用您发布的数据作为数据框Customer.ID(未转换df列)按升序排列Date

    Customer.ID

    数据:

    print(res)
    ##   Customer.ID       Date Rank
    ##2       576293 11/16/2015    6
    ##5       581252   1/4/2016    5
    ##7       581600  1/12/2015    2
    ##8       582560  4/13/2016    1
    ##10      586334  3/30/2014    1
    ##9       591674  3/21/2012    6
    

    如果您只想保留每个df <- structure(list(Customer.ID = c(591674L, 586334L, 582560L, 581600L, 581252L, 576293L), Date = c("3/21/2012", "3/30/2014", "4/13/2016", "1/12/2015", "1/4/2016", "11/16/2015"), Rank = c(6L, 1L, 1L, 2L, 5L, 6L)), .Names = c("Customer.ID", "Date", "Rank"), row.names = c(9L, 10L, 8L, 7L, 5L, 2L), class = "data.frame") 的最新日期(后跟较低排名)行,您可以使用Customer.ID执行以下操作:

    dplyr

    注意:

    1. library(dplyr) res <- df %>% group_by(Customer.ID) %>% arrange(desc(Date),Rank) %>% summarise_all(funs(first)) %>% ungroup() %>% arrange(Customer.ID) group_by并按Customer.ID按降序排序arrange,按升序排序Date
    2. Rank仅保留每个summarise_all的第一行。
    3. 最后,Customer.ID并按ungroup排序,以获得您想要的结果。
    4. 将您的数据用作数据框Customer.ID,并将df列转换为Date类:

      Date

      数据:

      print(res)
      ### A tibble: 7 x 3
      ##  Customer.ID       Date  Rank
      ##        <int>     <date> <int>
      ##1      576293 2015-11-16     6
      ##2      581252 2016-01-04     5
      ##3      581600 2015-01-12     2
      ##4      582560 2016-04-13     1
      ##5      586334 2014-03-30     1
      ##6      591674 2012-03-21     6