行绑定或注释数据框,基于在列之间使用匹配
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
我的数据大致是这样的:
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