行绑定或注释数据框,基于在列之间使用匹配

row bind or annotate a dataframe, based on matching using between, on columns

我的数据大致是这样的:

dictionary <- data.frame(fruit =  c("apple", "banana", "kiwi"), 
                         min_range = c(1, 520, 1200), 
                         max_range=  c(519, 900, 1800))

data <- data.frame(dictionary_id = c(12,600,1500, 3050, 2))

我想使用 dictionary 最小和最大范围注释数据框 data。使用 dplyr 的 between 是行不通的,因为我会向它传递一个它不接受的列。 我的方法是在 mutate() 中创建一个 if_else 语句,原则上它会像这样工作:

data %>%
  mutate(fruit = if_else(dictionary_id >= dictionary$min_range & dictionary_id <= dictionary$max_range,
                          dictionary$fruit,
                          "error"))

有什么想法吗?谢谢!

您可以使用fuzzyjoin

fuzzyjoin::fuzzy_left_join(data, dictionary, 
                            by = c('dictionary_id' = 'min_range', 'dictionary_id' = 'max_range'), 
                            match_fun = c(`>=`, `<=`))

#  dictionary_id  fruit min_range max_range
#1            12  apple         1       519
#2           600 banana       520       900
#3          1500   kiwi      1200      1800