如何拆分数据框中含多个手机号的列?R语言实现遇问题
嘿,我来帮你搞定这个手机号拆分的问题~
你的思路方向是对的,但之前的正则表达式写得有点局限,导致没得到预期结果。我给你几种更稳妥的解决办法:
方法1:用tidyr的separate函数(最直观推荐)
这是专门用来拆分列的工具,操作简单不容易出错,先确保你装了tidyr包:
# 首次使用先安装包 install.packages("tidyr") library(tidyr) # 读取数据时直接把字符列保留为字符串,避免因子转换问题 bookings <- read.csv('bookings.csv', header = TRUE, stringsAsFactors = FALSE) # 拆分set1列,按"/"分割成set3和set4,remove=FALSE可以保留原列(不需要就删掉这个参数) bookings <- separate(bookings, col = set1, into = c("set3", "set4"), sep = "/", remove = FALSE)
方法2:用base R的strsplit
如果不想加载额外包,用基础R也能轻松搞定:
bookings <- read.csv('bookings.csv', header = TRUE, stringsAsFactors = FALSE) # 按"/"拆分字符串,得到一个存储拆分结果的列表 split_mobiles <- strsplit(bookings$set1, "/") # 从列表里分别提取第一个和第二个手机号,赋值给新列 bookings$set3 <- sapply(split_mobiles, `[`, 1) bookings$set4 <- sapply(split_mobiles, `[`, 2)
修正你原来的gsub写法
如果你想继续用正则的方式,把正则改得更灵活点(不用固定10位,适配更多格式情况):
bookings <- read.csv('bookings.csv', header = TRUE, stringsAsFactors = FALSE) # 提取"/"前面的手机号 bookings$set3 <- gsub("/.*", "", bookings$set1) # 提取"/"后面的手机号 bookings$set4 <- gsub(".*/", "", bookings$set1)
这里/.*会匹配斜杠及后面所有内容,替换为空就得到前面的号码;.*/会匹配到最后一个斜杠的所有内容,替换为空就得到后面的号码,比固定长度的正则更可靠。
内容的提问来源于stack exchange,提问作者Lohith Arcot
相关产品推荐
相关产品推荐

