# for str_detect
library(stringr)
# some mock-up data to use
data.short <- data.frame(name = c(rep("Mister", 3), rep("Miss", 3)))
Во-первых,
data.short[which(str_detect(data.short$name, "Miss")),]
возвращает (как и ожидалось):
[1] Miss Miss Miss
Levels: Miss Mister
Во-вторых,
data.short[which(grep("Miss", data.short$name) > 1),]
возвращает:
[1] Mister Mister Mister
Levels: Miss Mister
Это потому, что следующее возвращает
grep("Miss", data.short$name)
[1] 4 5 6
, и если вы подвергнете это значение «больше 1», вы получите:
which(grep("Miss", data.short$name) > 1)
[1] 1 2 3
в итоге получим элементы синдекс 1,2,3 (результат последнего вызова), а не элементы с индексом 4,5,6, которые вы, вероятно, намеревались:
data.short[which(grep("Miss", data.short$name) > 1),]
[1] Mister Mister Mister
Levels: Miss Mister
В качестве примечания: grep
имеет аргумент value
вы можете настроить возврат индекса или значения индекса:
> grep("Miss", data.short$name)
[1] 4 5 6
> grep("Miss", data.short$name, value = TRUE)
[1] "Miss" "Miss" "Miss"
РЕДАКТИРОВАТЬ
Разложение того, что происходит с str_detect
:
str_detects
возвращает TRUEдля тех записей, где шаблон находится в строке
str_detect(data.short$name, "Miss")
[1] FALSE FALSE FALSE TRUE TRUE TRUE
which
, возвращается индекс
which(str_detect(data.short$name, "Miss"))
[1] 4 5 6
, который, в свою очередь, используется в качестве индекса, возвращает то, что вы ожидаете
data.short[which(str_detect(data.short$name, "Miss")),]
[1] Miss Miss Miss
Levels: Miss Mister
Надеюсь, это поможет.