基于R语言实现两列多手机号的末9位匹配判断需求
R语言实现手机号匹配需求
以下是针对你需求的具体实现步骤,用新手易上手的dplyr和stringr包完成:
步骤1:加载依赖包
先安装并加载处理数据和字符串的工具包:
# 首次使用先安装包 install.packages(c("dplyr", "stringr")) # 加载包 library(dplyr) library(stringr)
步骤2:模拟测试数据
先构造和你示例类似的测试数据,方便验证效果:
test_df <- tibble( Phones = c("881234567; 665553331;", "123456789; 987654321;", "555111222"), e_phone = c("881234567", "1234567890", "666777888") )
步骤3:核心匹配逻辑
用mutate新增列,通过字符串处理完成匹配判断:
result_df <- test_df %>% rowwise() %>% mutate( # 拆分Phones列的手机号,去除空格和末尾分号 phones_list = str_split(str_remove(Phones, ";$"), "; ") %>% unlist(), # 拆分e_phone列的手机号,提取每个手机号的末9位 e_phone_last9 = str_split(e_phone, "; ") %>% unlist() %>% str_sub(start = -9) %>% unique(), # 判断是否有匹配,有则YES,否则NO e_phone_match = ifelse(any(e_phone_last9 %in% phones_list), "YES", "NO") ) %>% # 移除中间临时列,保留原列和结果列 select(-phones_list, -e_phone_last9)
运行结果
执行后result_df的输出如下:
| Phones | e_phone | e_phone_match |
|---|---|---|
| 881234567; 665553331; | 881234567 | YES |
| 123456789; 987654321; | 1234567890 | YES |
| 555111222 | 666777888 | NO |
代码说明
rowwise():逐行处理数据,因为每行的手机号列表都是独立的str_remove(Phones, ";$"):去除Phones列末尾可能多余的分号str_split(..., "; "):把分号加空格分隔的手机号拆分成列表str_sub(start = -9):提取字符串的最后9个字符,也就是手机号末9位any(e_phone_last9 %in% phones_list):判断e_phone的末9位是否在Phones的手机号列表中存在匹配
内容的提问来源于stack exchange,提问作者sebekkg
相关产品推荐
相关产品推荐

