2011-11-23 64 views
6

我有一个向量构成的条目如“ZZZ1Z01Z0ZZ0”,“1001ZZ0Z00Z0”的,等等,我想基于诸如条件子集这个向量:如何基于字符串字符子集向量?

  1. 第三个字符为Z
  2. 第三和第七个字符面向Z
  3. 第三和第七字符是Z,并且没有其他角色的面向Z

我试着用strsplit和grep玩弄,但我不能想出一个根据posi限制我的条件字符串上的字符。有什么建议么?

非常感谢!

+1

矢量的长度是否总是一样,只有0,1和Z?我不知道这些东西是如何工作的,我只能给它一个正则表达式:) – sinni800

回答

10

您可以使用正则表达式来执行此操作(有关正则表达式的详细信息,请参见?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) 
+0

为什么你会考虑用其他方式做呢? –

+0

非常感谢你的帮助。我已经开始玩正则表达式,他们是**真棒**!不敢相信我之前没有碰到过这个。谢谢! –

2

如果需要,您可以使用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的做法将是一个痛苦。正则表达式更适合于像第三种限制这样的问题,并且学习如何使用它们从来都不是一个坏主意。

3

扩大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包。 (除了稍微更具可读性的代码外,没有真正的区别。)

+0

我的投票可以识别子集(。,grepl(。))建议。 –