我的数据集为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));
答案 0 :(得分:1)
明确了OP的所需输出:
我们也可以使用基数R执行此操作,这将比使用dplyr
的{{1}}方法更快,因为我们不必循环遍历所有唯一group_by(Customer.ID)
:< / p>
Customer.ID
注意:
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
。Rank
中的重复项,以便只保留每个Customer.ID
的第一行。结果使用您发布的数据作为数据框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
注意:
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
。Rank
仅保留每个summarise_all
的第一行。Customer.ID
并按ungroup
排序,以获得您想要的结果。将您的数据用作数据框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