2011-11-23 71 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(。))建議。 –