Индекс несоответствующей строки в списке символьных векторов - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть список векторов символов, и я хочу использовать команду grep, чтобы найти места, которые не совпадают.См. Пример ниже:

x.lst <- list()
x.lst[[1]] <- c("she", "said", "hello")
x.lst[[2]] <- c("hello")
x.lst[[3]] <- c("whats", "up")

Я хочу, чтобы функция возвращала индекс несогласованного шаблона в каждом векторе.В моем примере возвращаем индекс всего, кроме «привет».Если я использую следующее:

lapply(x.lst, function(x) x[-grep("hello",x)])

Я получаю:

[[1]]
[1] "she"  "said"

[[2]]
character(0)

[[3]]
character(0) 

желаемый результат:

[[1]]
[1] 1    2

[[2]]
[1] character(0)

[[3]]
[1] 1    2 

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Один вариант с Map из base R

unname(Map(grep, pattern = "hello", x.lst, invert = TRUE))

Или с использованием tidyverse

library(tidyverse)
map(x.lst, ~ str_detect(.x, "hello") %>% 
               `!` %>% 
                which)
#[[1]]
#[1] 1 2

#[[2]]
#integer(0)

#[[3]]
#[1] 1 2
0 голосов
/ 05 февраля 2019

Используйте invert = TRUE для возврата индекса элементов, которые не совпадают.

lapply(x.lst, function(x) grep("hello",x, invert = TRUE))

#[[1]]
#[1] 1 2

#[[2]]
#integer(0)

#[[3]]
#[1] 1 2

A tidyverse альтернатива

library(tidyverse)
map(x.lst, ~ setdiff(seq_along(.), str_which(., "hello")))
#You can always do same as base here as well
#map(x.lst, ~ grep("hello",., invert = TRUE))

#[[1]]
#[1] 1 2

#[[2]]
#integer(0)

#[[3]]
#[1] 1 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...