我希望将一个表连接到我的数据集,该表位于两个值之间。它最好在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]