我有一组要在数据框中检查的代码,如果它们存在,我想创建一列以指示TRUE
或FALSE
。
因此,我在数据资料库中拥有一些代码:OO14562,MM156789076,AB1234674,HIB00000,POL112310
数据帧在这里:
df<-structure(list(Codes = structure(c(5L, 4L, 1L, 3L, 7L, 8L, 2L,
6L), .Label = c("AB1234674", "AB13", "HIB00000", "MM156789076",
"OO14562", "POL1123", "POL112310", "TY543"), class = "factor")), .Names = "Codes", row.names = c(NA,
-8L), class = "data.frame")
根据数据框,前5个应返回TRUE,后三个应为FALSE。
我的代码在这里
gsub([OO|MM|AB|HIB|POL[0-9]{5-9})
但这并不能带我去任何地方。
答案 0 :(得分:3)
一个,我们需要使用括号而不是括号来分隔字母集。括号中的“匹配项之一”与管道配对时将无法预测。 [aa|bb|cc]
实际上将与a
,b
,c
或文字|
相匹配,这不是您想要的行为。
二,我们将使用grepl
,因为它返回逻辑向量,无需使用gsub
。
三,要匹配的数量在花括号{ }
中指定,但最小值和最大值由逗号而不是破折号分隔。
您也可以使用[0-9]
代替\\d
(任何数字),但为简洁起见,我喜欢\\d
。
为了完整起见,我添加了^
和$
来匹配模式后字符串的开头和结尾。
这给我们:
df$check <- grepl("^(OO|MM|AB|HIB|POL)\\d{5,9}$", df$Codes)
Codes check
1 OO14562 TRUE
2 MM156789076 TRUE
3 AB1234674 TRUE
4 HIB00000 TRUE
5 POL112310 TRUE
6 TY543 FALSE
7 AB13 FALSE
8 POL1123 FALSE