如何在R中实现不同表两列的前缀部分匹配并批量更新值
R实现百万级数据表的前缀匹配与值更新
示例数据构造
先还原你的数据集:
df1 <- data.frame( PRODUCT_8 = c("72093234", "30023000", "12093236", "30066012"), VAT = c("0,2", "0,2", "0,2", "0,2"), stringsAsFactors = FALSE ) df2 <- data.frame( KN = c("30022000", "30023000", "300660", "72"), stringsAsFactors = FALSE )
高效解决方案
针对百万级数据,必须使用向量化操作避免循环,以下是两种高效实现方式:
方法1:stringr包向量化正则匹配
通过构造前缀匹配的正则表达式,一次性完成所有匹配:
library(stringr) # 构造前缀匹配的正则规则:以任意KN值开头 prefix_pattern <- str_c("^", df2$KN, collapse = "|") # 匹配PRODUCT_8并更新VAT df1$VAT[str_detect(df1$PRODUCT_8, prefix_pattern)] <- "0,9"
方法2:data.table包优化大数据操作
data.table对超大数据集的操作效率远高于基础data.frame,适合百万级场景:
library(data.table) # 转换为data.table格式 setDT(df1) setDT(df2) # 构造前缀正则 prefix_pattern <- str_c("^", df2$KN, collapse = "|") # 批量更新匹配行的VAT值 df1[grepl(prefix_pattern, PRODUCT_8), VAT := "0,9"]
关于你尝试的方法说明
pmatch:仅支持按元素顺序的部分字符串匹配,不支持长字符串匹配短前缀的逻辑startswith:只能传入单个前缀参数,无法批量匹配多个前缀- sqldf:需要手动编写大量
OR连接的LIKE条件,代码冗余且效率低于向量化正则方法
内容的提问来源于stack exchange,提问作者Redesfist
相关产品推荐
相关产品推荐

