Поиск строк определенной длины и определенных символов - PullRequest
0 голосов
/ 15 ноября 2018

Пример данных

a<-c("hour","four","ruoh", "six", "high", "our")

Я хочу найти все строки, которые содержат o & u & h & и состоят из 4 символов, но порядок не имеет значения.

Я хочу вернуть "hour","four","ruoh" это моя попытка

grepl("o+u+r", a) nchar(a)==4

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Использование grepl с вашим отредактированным методом (r вместо h):

a<-c("hour","four","ruoh", "six", "high", "our")

a[grepl(pattern="o", x=a) & grepl(pattern="u", x=a) & grepl(pattern="r", x=a) & nchar(a)==4]

Возвращает:

[1] "hour" "four" "ruoh"
0 голосов
/ 15 ноября 2018

Для сопоставления строк длиной 4 , содержащих символы h , o и u , используйте:

grepl("(?=^.{4}$)(?=.*h)(?=.*o)(?=.*u)",
      c("hour","four","ruoh", "six", "high", "our"),
      perl = TRUE)
[1]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
  • (?=^.{4}$): длина строки 4.
  • (?=.*x): x встречается в любой позиции строки.
0 голосов
/ 15 ноября 2018

Вы можете использовать strsplit и setdiff, я добавил дополнительный крайний случай к вашим образцам данных:

a<-c("hour","four","ruoh", "six", "high", "our","oouh")
a[nchar(a) == 4 &
  lengths(lapply(strsplit(a,""),function(x) setdiff(x, c("o","u","h")))) == 1]
# [1] "hour" "ruoh"

или grepl:

a[nchar(a) == 4 & !rowSums(sapply(c("o","u","h"), Negate(grepl), a))]
# [1] "hour" "ruoh" "oouh"

sapply(c("o","u","h"), Negate(grepl), a) дает вам матрицу, в которой слово не содержит каждую букву, тогда rowSums действует как any, примененное к строке, так как оно будет приведено к логическому.

...