Найти значение столбца, содержащееся в другом столбце 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