R-基于下一个最大值的左联接

  • 本文关键字:最大值 下一个 r join
  • 更新时间 :
  • 英文 :


我希望将一个表连接到我的数据集,该表位于两个值之间。它最好在dplyr管道内工作。数据集如下所示:

data <- data.frame(ID = c(01,02,03,04,05,06), result = c(0.33,0,-2.11,3.33,4.44,-7.1))
key <- data.frame(upper_value = c(-4,-1,1,4,10), points = c(0,1,2,3,4))

结果的最低值可以是10,但由于我正在搜索下一个最大(或相等(值,数据集中没有提到它。

请注意,结果不一定是整数。

预期结果如下:

expected <- data.frame(ID = c(01,02,03,04,05,06), result = c(0.3333,0,-2.11,3.3333,4.44,-7.1), c(2,2,1,3,4,0))

您可以使用fuzzyjoin包中的fuzzy_left_join-

library(dplyr)
fuzzyjoin::fuzzy_left_join(data, key, by = c('result' = 'upper_value'), 
match_fun = `<`) %>%
arrange(ID, upper_value) %>%
group_by(ID) %>%
slice(1L) %>%
ungroup
#  ID result upper_value points
#  <dbl>  <dbl>       <dbl>  <dbl>
#1     1   0.33           1      2
#2     2   0              1      2
#3     3  -2.11          -1      1
#4     4   3.33           4      3
#5     5   4.44          10      4
#6     6  -7.1           -4      0

我们可以使用findInterval

data$new <- findInterval(data$result, key$upper_value)

-输出

data
#  ID result new
#1  1   0.33   2
#2  2   0.00   2
#3  3  -2.11   1
#4  4   3.33   3
#5  5   4.44   4
#6  6  -7.10   0

在本例中,"点"与索引相同。在这种情况下,它是不同的

data$new <- key$points[findInterval(data$result, key$upper_value) + 1]