Найдите строки, в которых одна строка столбца находится в другом столбце, используя dplyr в R

Требуется вернуть строки, где значение в одном столбце существует как строка в другом столбце (в той же строке).

У меня df:

A <- c("cat", "dog", "boy")
B <- c("cat in the cradle", "meet the parents", "boy mmets world")

df <- as.data.frame(A, B)

A       B
cat     cat in the cradle
dog     meet the parents
boy     boy meets world

Я пробую такие вещи, как:

df2 <- df %>%
          filter(grepl(A, B)) # doesn't work because it thinks A is the whole column vector

df2 <- df %>%
          filter(B %in% A) # which doesn't work because it has to be exact

Я хочу произвести

A       B
cat     cat in the cradle
boy     boy meets world

Заранее спасибо!

Мэтт


person Matt W.    schedule 09.05.2017    source источник


Ответы (2)


Вы можете применить функцию к обоим векторам с помощью Map или перебирать строку с помощью sapply

df %>%
  filter(unlist(Map(function(x, y) grepl(x, y), A, B)))
    A                 B
1 cat cat in the cradle
2 boy   boy mmets world

df %>%
  filter(sapply(1:nrow(.), function(i) grepl(A[i], B[i])))
    A                 B
1 cat cat in the cradle
2 boy   boy mmets world
person JasonWang    schedule 09.05.2017

Мы можем сделать это с Map

df[mapply(grepl, df$A, df$B),]
#    A                 B
#1 cat cat in the cradle
#3 boy   boy mmets world

Обновлять

Используя tidyverse, аналогичный вариант будет purrr::map2 с stringr::str_detect

library(tidyverse)
df %>% 
   filter(map2_lgl(B, A,  str_detect))
#     A                 B
#1 cat cat in the cradle
#2 boy   boy mmets world

данные

df <- data.frame(A, B, stringsAsFactors=FALSE)
person akrun    schedule 09.05.2017