Вы можете использовать findInterval
как:
DF1$Rank <- DF2$Rank[findInterval(DF1$Day, c(0,DF2$Day), left.open = TRUE)]
DF1
# Day Rank
#1 2020-01-12 3
#2 2020-01-15 5
В случае, если DF2 не отсортировано:
i <- order(DF2$Day)
j <- findInterval(DF1$Day, c(0,DF2$Day[i]), left.open = TRUE)
DF1$Rank <- DF2$Rank[i[j]]
Или в случае DF2 $ Ранг равен 1:nrow(DF2)
, а DF2
отсортировано.
DF1$Rank <- findInterval(DF1$Day, c(0,DF2$Day), left.open = TRUE)
Данные:
DF1 <- data.frame(Day=as.Date(c("2020-01-12", "2020-01-15")), Rank=NA)
DF2 <- data.frame(Day=as.Date(c("2020-01-10", "2020-01-11", "2020-01-13"
, "2020-01-14", "2020-01-17")), Rank=1:5)
Для обновленного Вопроса :
DF1 <- data.frame(Item=c("A","A","B"), Day=as.Date(c("2020-01-12", "2020-01-13", "2020-01-13")), Rank=NA)
DF2 <- data.frame(Item=c(rep("A",3),rep("B",2)), Day=as.Date(c("2020-01-10", "2020-01-11", "2020-01-14", "2020-01-14", "2020-01-17")), Rank=1:5)
DF1$Rank <- unlist(sapply(unique(DF1$Item), function(i) {DF2$Rank[DF2$Item==i][findInterval(DF1$Day[DF1$Item==i], c(0,DF2$Day[DF2$Item==i]), left.open = TRUE)]}))
DF1
# Item Day Rank
#1 A 2020-01-12 3
#2 A 2020-01-13 3
#3 B 2020-01-13 4
Также взгляните на Соедините один фрейм данных с другим по членству в диапазоне