如何基于字符串字符子集向量?
我有一个向量构成的条目如“ZZZ1Z01Z0ZZ0”,“1001ZZ0Z00Z0”的,等等,我想基于诸如条件子集这个向量:如何基于字符串字符子集向量?
- 第三个字符为Z
- 第三和第七个字符面向Z
- 第三和第七字符是Z,并且没有其他角色的面向Z
我试着用strsplit和grep玩弄,但我不能想出一个根据posi限制我的条件字符串上的字符。有什么建议么?
非常感谢!
您可以使用正则表达式来执行此操作(有关正则表达式的详细信息,请参见?regexp
)。
grep
返回匹配的位置并返回一个零长度的向量,如果找不到匹配的话。您可能需要使用grepl
,因为它会返回可用于子集的逻辑向量。
z <- c("ZZZ1Z01Z0ZZ0", "1001ZZ0Z00Z0")
# 3rd character is Z ("^" is start of string, "." is any character)
grep("^..Z", z)
# 3rd and 7th characters are Z
grep("^..Z...Z", z)
# 3rd and 7th characters are Z, no other characters are Z
# "[]" defines a "character class" and "^" in a character class negates the match
# "{n}" repeats the preceding match n times, "+" repeats is one or more times
grep("^[^Z]{2}Z[^Z]{3}Z[^Z]+", z)
为什么你会考虑用其他方式做呢? –
非常感谢你的帮助。我已经开始玩正则表达式,他们是**真棒**!不敢相信我之前没有碰到过这个。谢谢! –
如果需要,您可以使用substr命令将前两个没有正则表达式的字符串拉出来。
# Grab the third character in each element and compare it to Z
substr(z, 3, 3) == "Z"
# Check if the 3rd and 7th characters are both Z
(substr(z, 3, 3) == "Z") & (substr(z, 7, 7) == "Z")
然而,正则表达式的方法约书亚给了更加灵活,努力落实第三限制你必须使用SUBSTR的做法将是一个痛苦。正则表达式更适合于像第三种限制这样的问题,并且学习如何使用它们从来都不是一个坏主意。
扩大Josh的答案,你想
your_dataset <- data.frame(
z = c("ZZZ1Z01Z0ZZ0", "1001ZZ0Z00Z0")
)
regexes <- c("^..Z", "^..Z...Z", "^[^Z]{2}Z[^Z]{3}Z[^Z]+")
lapply(regexes, function(rx)
{
subset(your_dataset, grepl(rx, z))
})
还要考虑与str_detect(z, rx)
更换grepl(rx, z)
,使用stringr
包。 (除了稍微更具可读性的代码外,没有真正的区别。)
我的投票可以识别子集(。,grepl(。))建议。 –
矢量的长度是否总是一样,只有0,1和Z?我不知道这些东西是如何工作的,我只能给它一个正则表达式:) – sinni800