【发布时间】:2021-12-30 00:34:52
【问题描述】:
我的原始数据有很多个人信息,所以我在R中屏蔽了它们。示例数据和我的原始代码如下:
install.packages("stringr")
library(string)
x = c("010-1234-5678",
"John 010-8888-8888",
"Phone: 010-1111-2222",
"Peter 018.1111.3333",
"Year(2007,2019,2020)",
"Alice 01077776666")
df = data.frame(
phoneNumber = x
)
pattern1 = "\\d{3}-\\d{4}-\\d{4}"
pattern2 = "\\d{3}.\\d{4}.\\d{4}"
pattern3 = "\\d{11}"
delPhoneList1 <- str_match_all(df, pattern1) %>% unlist
delPhoneList2 <- str_match_all(df, pattern2) %>% unlist
delPhoneList3 <- str_match_all(df, pattern3) %>% unlist
我从数据集中找到了三种模式,每种结果如下:
> delPhoneList1
[1] "010-1234-5678" "010-8888-8888" "010-1111-2222"
> delPhoneList2
[1] "010-1234-5678" "010-8888-8888" "010-1111-2222" "018.1111.3333" "007,2019,2020"
> delPhoneList3
[1] "01077776666"
Pattern1 是我所在国家/地区使用破折号的典型电话号码类型,但有人使用逗号键入诸如 pattern2 之类的号码。但是,pattern2 也包含 pattern1,因此它会像年份系列一样检测其他模式。这是一个意想不到的结果。
我的问题是如何匹配我定义的确切模式。模式2包含过多的模式,例如"007,2019,2020" from "Year(2007,2019,2020)"。
此外,下一步是使用以下代码屏蔽数字:
for (phone in delPhoneList1) {
df$phoneNumber <- gsub(phone, "010-9999-9999", df$phoneNumber)
}
我认为代码对我来说是完美的,但如果你有更有效的方法,请告诉我。
谢谢。
【问题讨论】:
-
根据您问题顶部的 6 个示例电话号码,您想要的实际屏蔽输出是什么?
-
为什么不只是
df$phoneNumber <- gsub("(\\d{3}-\\d{4}-\\d{4})|(\\d{3}\\.\\d{4}\\.\\d{4})|(\\d{11})", "010-9999-9999", df$phoneNumber)? -
@ekoam OMG。非常感谢!!!我是 R 的初学者,所以我不知道编写代码的有效方法。你解决了我的两个问题,一个是在
d{3}后面加\\的模式问题,另一个是短版。 -
仅供参考,pattern2 中的
.匹配“任何字符”。相反,将其转义,如pattern2 = "\\d{3}\\.\\d{4}\\.\\d{4}",它将仅匹配句点。或者更好的是,pattern2 = "\\d{3}[-.]\\d{4}[-.]\\d{4}"将在一个正则表达式中涵盖模式 1 和 2。