R语言表合并报错:如何结合等值匹配与Levenshtein距离模糊匹配?
错误原因与解决方案
错误原因
merge(table1, table2, by = NULL)会生成两个表的笛卡尔积(共16行),但你在filter中使用table1$col1_a和table2$col1_b时,调用的是原始数据表的列(各4个元素),返回的布尔向量长度为4,与合并后数据框的16行不匹配,因此触发长度错误。
解决方案
方案1:修正filter中的列引用
直接使用合并后数据框的列名(而非原表的$引用),确保对每一行的对应列计算距离:
library(stringdist) library(dplyr) table1 <- data.frame(col1_a = c("appple", "orangesz", "banana", "pear"), col2_a = c(123, 456, 789, 234)) table2 <- data.frame(col1_b = c("aples", "orange", "bannnana", "pear"), col2_b = c(123, 456, 789, 567)) is_close_enough <- function(s1, s2) { stringdist(s1, s2) < 5 } # 修正列引用,使用合并后的列名 result <- merge(table1, table2, by = NULL) %>% filter(is_close_enough(col1_a, col1_b), col2_a == col2_b)
方案2:先按col2合并再过滤(更高效)
先通过merge匹配相等的col2_a和col2_b,再过滤Levenshtein距离条件,避免生成不必要的笛卡尔积:
library(stringdist) library(dplyr) table1 <- data.frame(col1_a = c("appple", "orangesz", "banana", "pear"), col2_a = c(123, 456, 789, 234)) table2 <- data.frame(col1_b = c("aples", "orange", "bannnana", "pear"), col2_b = c(123, 456, 789, 567)) # 先按col2合并,再过滤距离条件 result <- merge(table1, table2, by.x = "col2_a", by.y = "col2_b") %>% filter(stringdist(col1_a, col1_b) < 5)
两种方案都能得到正确结果,方案2在数据量较大时性能更优。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

