Сопоставить всю ячейку list1 с началом всех ячеек list2 - PullRequest
1 голос
/ 17 мая 2019

Текущий вопрос является расширением этого вопроса .
Из предыдущего вопроса у меня есть код:

list1<-list("q","w","e","r","t")
list2<-list("a","a","aq","c","f","g")

any(sapply(list1, grepl, list2))
# [1] TRUE

Он соответствует по одной целой строке из каждой ячейки list1 по одному на любую часть строки в list2 в каждой ячейке.Если есть какое-либо совпадение, я получаю в качестве выходного сингла TRUE.Теперь мне нужно изменить его так, чтобы только начало строки в каждой ячейке совпадало с list2 .Например, если у меня есть

list1<-list("q","w","e","r","t")
list2<-list("a","a","aq","c","f","g")

ИЛИ

list1<-list("q","w","e","r","t")
list2<-list("a","a","aqaa","c","f","g")

, результат должен быть FALSE.Но если у меня есть:

list1<-list("q","w","e","r","t")
list2<-list("a","a","qa","c","f","g")

ответ должен быть TRUE.

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Здесь также можно использовать якорь regex.Обратите внимание, что я изменяю ваш исходный ввод, чтобы быть более поучительным, как это будет выглядеть.

> list1<-list("q","w","e","r","t")
> list2<-list("a","a","aq","c","rs", "t")
> 
> lapply(list1, function(x) grepl(paste0("^", x, "$"), list2))
[[1]]
[1] FALSE FALSE FALSE FALSE FALSE FALSE

[[2]]
[1] FALSE FALSE FALSE FALSE FALSE FALSE

[[3]]
[1] FALSE FALSE FALSE FALSE FALSE FALSE

[[4]]
[1] FALSE FALSE FALSE FALSE FALSE FALSE

[[5]]
[1] FALSE FALSE FALSE FALSE FALSE  TRUE

Обратите внимание, что это должно работать и с sapply.

РЕДАКТИРОВАТЬ:Чтобы получить более подробную информацию

Вот как будут выглядеть ваши результаты (без any), если вы используете sapply

sapply(list1, function(x) grepl(paste0("^", x, "$"), list2))

      [,1]  [,2]  [,3]  [,4]  [,5]
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE  TRUE

Теперь с помощью any на оригиналевывод с lapply против выхода sapply будет выглядеть следующим образом:

lapply(lapply(list1, function(x) grepl(paste0("^", x, "$"), list2)), any)
[[1]]
[1] FALSE

[[2]]
[1] FALSE

[[3]]
[1] FALSE

[[4]]
[1] FALSE

[[5]]
[1] TRUE

И для sapply

any(sapply(list1, function(x) grepl(paste0("^", x, "$"), list2)))
[1] TRUE

Но если вы хотите apply к вашемувыходы из исходного lapply кода, вы можете использовать:

sapply(lapply(list1, function(x) grepl(paste0("^", x, "$"), list2)), any)
[1] FALSE FALSE FALSE FALSE  TRUE

Это зависит от желаемого выхода.

1 голос
/ 17 мая 2019

Вы можете использовать тот же метод, что и раньше, с startsWith.Вы просто должны изменить порядок списка (обратите внимание, что он проверяет, начинаются ли какие-либо элементы в list2 с буквы в list1.

list1<-list("q","w","e","r","t")
list2<-list("a","a","qa","c","f","g")

any(sapply(list2, startsWith, unlist(list1)))
[1] TRUE
...