R包fuzzyjoin中multi_by/multi_match_fun与by/match_fun的区别疑问
问题描述
有人能帮我理解R包fuzzyjoin中的multi_by和multi_match_fun与by和match_fun的实际功能差异吗?以下是v0.1.6版本的包文档说明:
by Columns of each to join
match_fun Vectorized function given two columns, returning TRUE or FALSE as to whether they are a match. Can be a list of functions one for each pair of columns specified in by (if a named list, it uses the names in x). If only one function is given it is used on all column pairs.
multi_by Columns to join, where all columns will be used to test matches together
multi_match_fun Function to use for testing matches, performed on all columns in each data frame simultaneously
我无法理解二者的差异:难道使用by/match_fun时,不也是所有列共同参与匹配测试吗?即我是否错误地认为,只有当match_fun提供的函数在所有列对上都匹配时,才会返回连接/匹配结果?
核心差异解析
1. by + match_fun:逐列独立匹配后取交集
你的理解没错:by指定的每一组列对会单独用match_fun(对应列对的函数)做匹配判断,只有当所有列对的匹配结果都为TRUE时,两行才会被判定为匹配。本质是多轮独立匹配后的“且”逻辑。
举个实际例子:
# 假设x有a、b列,y有a2、b2列 fuzzy_inner_join(x, y, by = c("a" = "a2", "b" = "b2"), match_fun = list( function(x,y) abs(x-y) <= 1, # a和a2差值≤1 function(x,y) x == y # b和b2完全相等 ))
只有当x$a与y$a2的差值≤1 且 x$b与y$b2完全相等时,这两行才会被匹配上。
2. multi_by + multi_match_fun:多列整体做一次匹配判断
这组参数是把multi_by指定的所有列当成一个整体输入,一次性传给multi_match_fun做判断,支持跨列计算的自定义匹配逻辑,这是by+match_fun做不到的。
比如要实现“x的a+b和y的a2+b2差值≤2就算匹配”:
fuzzy_inner_join(x, y, multi_by = c("a" = "a2", "b" = "b2"), multi_match_fun = function(x_cols, y_cols) { # x_cols是x中a、b列组成的子集,y_cols是y中a2、b2列组成的子集 abs(rowSums(x_cols) - rowSums(y_cols)) <= 2 })
这里函数接收的是多列组成的数据集,直接基于整体计算结果判断是否匹配,不需要逐列单独验证。
总结
by+match_fun:逐列独立匹配,所有列对都通过才算匹配,是固定的“且”逻辑multi_by+multi_match_fun:多列作为整体输入,匹配逻辑完全自定义,支持跨列运算的复杂规则
内容的提问来源于stack exchange,提问作者tospo

