Найти значение столбца, содержащееся в другом столбце R

У меня есть несколько столбцов адресов, где они могут содержать дублированную информацию (но, как правило, не будет точно дублированной информации).

Следующий код предоставит пример моей проблемы,

id= c(1, 2)
add1 = c("21ST AVE", "5TH ST")
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD")
df = data.frame(id, add1, add2) 
df$combined = paste(add1, add2)
df

Это дает следующий результат,

  id      add1             add2                  combined
1   1 21ST AVE 21ST AVE BLAH ST 21ST AVE 21ST AVE BLAH ST
2   2   5TH ST   EAST BLAH BLVD     5TH ST EAST BLAH BLVD

Вывод, который мне нужен, заключается в следующем,

  id      add1             add2                  combined
1   1 21ST AVE 21ST AVE BLAH ST          21ST AVE BLAH ST
2   2   5TH ST   EAST BLAH BLVD     5TH ST EAST BLAH BLVD

Я хочу определить, что находится в add1 содержится в add2, Если я найду это add2 содержит ту же информацию, что add1 обеспечивает, тогда я либо хочу избежать объединения этих конкретных значений столбца, либо удалить повторяющуюся информацию в объединенном столбце (что, по моему мнению, потребует решения другой проблемы повторяющихся фраз в строке). Мне не удалось найти пример поиска значений столбцов, которые "содержатся в", а не "точные", - и я работаю с более чем 500K случаями в наборе данных, где эта проблема встречается часто. Любая помощь приветствуется.

2 ответа

Решение

Мы split второй и третий столбец на один или несколько пробелов (\\s+), затем paste union из соответствующих строк с mapply создать "комбинированный"

lst <- lapply(df[2:3], function(x) strsplit(as.character(x), "\\s+"))
df$combined <- mapply(function(x,y) paste(union(x, y), collapse=" "), lst$add1, lst$add2)
df$combined
#[1] "21ST AVE BLAH ST"      "5TH ST EAST BLAH BLVD"

Или другой вариант gsub

gsub("((\\w+\\s*){2,})\\1", "\\1", do.call(paste, df[2:3]))
#[1] "21ST AVE BLAH ST"      "5TH ST EAST BLAH BLVD"

Вот один из способов сделать это, когда ifelse проверяет лиadd1 в add2и, если так, то не включает его, иначе объединяет их:

id= c(1, 2)
add1 = c("21ST AVE", "5TH ST")
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD")
df = data.frame(id, add1, add2, stringsAsFactors = F) 

require(stringr)
require(dplyr)

df %>% mutate(combined = ifelse(str_detect(add2, add1), 
                                add2, 
                                str_c(add1, add2)))

Выход:

  id     add1             add2             combined
1  1 21ST AVE 21ST AVE BLAH ST     21ST AVE BLAH ST
2  2   5TH ST   EAST BLAH BLVD 5TH STEAST BLAH BLVD
Другие вопросы по тегам