我有一個向量構成的條目如「ZZZ1Z01Z0ZZ0」,「1001ZZ0Z00Z0」的,等等,我想基於諸如條件子集這個向量:如何基於字符串字符子集向量?
- 第三個字符爲Z
- 第三和第七個字符面向Z
- 第三和第七字符是Z,並且沒有其他角色的面向Z
我試着用strsplit和grep玩弄,但我不能想出一個根據posi限制我的條件字符串上的字符。有什麼建議麼?
非常感謝!
我有一個向量構成的條目如「ZZZ1Z01Z0ZZ0」,「1001ZZ0Z00Z0」的,等等,我想基於諸如條件子集這個向量:如何基於字符串字符子集向量?
我試着用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