首页 > 解决方案 > 对应于另一个数据框的下一个可用日期的排名

问题描述

有人可以帮我满足以下要求吗?

DF1:

 Item       Day            Rank
  A     2020-01-12
  A     2020-01-13
  B     2020-01-13

DF2:

  Item        Day            Rank
   A       2020-01-10         1
   A       2020-01-11         2
   A       2020-01-14         3
   B       2020-01-14         4
   B       2020-01-17         5

如果我们在 DF1 中有 DF2 中不存在的 Day,那么我想从与 DF2 中的日期对应的下一个日期获取 DF1 日期的排名。在这里,DF1 中的 2020-01-12 没有任何排名,因此它应该从 DF2 搜索下一个日期,即 2020-01-13 并且相应的排名应该作为输出。

最终输出(DF1):

 Item       Day            Rank
  A     2020-01-12          3
  A     2020-01-13          3
  B     2020-01-13          4

标签: r

解决方案


这是一个基本的 R 解决方案(假设您的列Day在两者中DF1并且DF2已经属于类Date

DF1 <- do.call(rbind,
               c(make.row.names = F,
                 lapply(split(DF1,DF1$Item), function(v) {
                   z <- subset(DF2,Item == unique(v$Item))
                   v <- within(v, Rank <- findInterval(Day, z$Day)+ min(z$Rank))
                   }
                   )
                 )
               )

这样

> DF1
  Item        Day Rank
1    A 2020-01-12    3
2    A 2020-01-13    3
3    B 2020-01-13    4

数据

DF1 <- structure(list(Item = c("A", "A", "B"), Day = structure(c(18273, 
18274, 18274), class = "Date"), Rank = c(NA, NA, NA)), row.names = c(NA, 
-3L), class = "data.frame")

DF2 <- structure(list(Item = c("A", "A", "A", "B", "B"), Day = structure(c(18271, 
18272, 18275, 18275, 18278), class = "Date"), Rank = 1:5), row.names = c(NA, 
-5L), class = "data.frame")

推荐阅读