применить регулярное выражение в одном кадре данных на основе столбца в другом кадре данных - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть два фрейма данных --- таблица A - это таблица шаблонов, а таблица B - это таблица имен. Я хочу поднабор таблицы B, где она соответствует шаблону в таблице a.

A <- data.frame(pattern = c("aa", "bb", "cc", "dd"))
B <- data.frame(name = "aa1", "bb1", "abc", "def" ,"ddd")

Я пытаюсь сделать цикл выглядит следующим образом:

for (i in 1:nrow(A)){
for (j in 1:nrow(B)){
DT <- data.frame(grep(A$pattern[i], B$name[j], ignore.case = T, value = T))
}}

И я хочу, чтобы моя результирующая таблица DT содержала только aa1, bb1 и ddd

Но это очень медленно. Мне просто интересно, есть ли более эффективный способ сделать это? Многие спасибо!

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

кажется, что есть небольшая ошибка в ваших исходных входных данных (пропущенный B$name неправильно объявлен и должен включать stringsAsFactors = F для обоих data.frame объектов):

> A <- data.frame(pattern = c("aa", "bb", "cc", "dd"), stringsAsFactors = F)
> B <- data.frame(name = c("aa1", "bb1", "abc", "def" ,"ddd"), stringsAsFactors = F)

КОД

# using sapply with grepl
> indices <- sapply(1:nrow(A), function(z) grepl(A$pattern[z], B$name[z]))
> indices
[1]  TRUE  TRUE FALSE FALSE

> B[indices, ]
[1] "aa1" "bb1" "ddd"
0 голосов
/ 17 сентября 2018

Двойной цикл не требуется, в следующем случае используется только цикл sapply.

inx <- unlist(sapply(A$pattern, grep, B$name))
B[inx, , drop = FALSE]
#  name
#1  aa1
#2  bb1
#5  ddd
...