Обнаружение аналогичного последовательного шаблона из двух столбцов - PullRequest
0 голосов
/ 29 января 2019
x1= c("Sunwood", "Greengrass", "bluesky")
x2= c("Sun wood", "green", "sky Pl")

testframe = data.frame(Address1=x1, Address2=x2) 

Вывод для третьего столбца, который сравнивает оба столбца, должен сказать «Да».Потому что "солнце", "зеленый" и "небо" присутствуют, указывая на совпадение.Как мы сможем его обнаружить (до трех последовательных букв)

1 Ответ

0 голосов
/ 29 января 2019

Вот одна tidyverse возможность:

testframe %>%
 mutate_if(is.factor, as.character) %>%
 mutate(Res = ifelse(str_detect(str_extract(Address1, "^.{3}"), 
                          fixed(str_extract(Address2, "^.{3}"), ignore_case = TRUE)), "Yes", "No"))

    Address1 Address2 Res
1    Sunwood Sun wood Yes
2 Greengrass    green Yes
3    bluesky   sky Pl  No

Он проверяет, соответствуют ли первые три элемента из «Address1» (независимо от регистра) первым трем элементам из «Address2».Если это так, он возвращает «Да», в противном случае «Нет».

Или задайте регистр вручную, чтобы уменьшить значение:

testframe %>%
 mutate_if(is.factor, as.character) %>%
 mutate(Res = ifelse(str_detect(tolower(str_extract(Address1, "^.{3}")), 
                                tolower(str_extract(Address2, "^.{3}"))), "Yes", "No"))

То же самое, но упрощено на основе идеи @PoGibas:

testframe %>%
 mutate_if(is.factor, as.character) %>%
 mutate(Res = ifelse(tolower(str_extract(Address1, "^.{3}")) == tolower(str_extract(Address2, "^.{3}")), "Yes", "No"))

Или только с основанием R:

testframe$Address1 <- as.character(testframe$Address1)  
testframe$Address2 <- as.character(testframe$Address2)

testframe$Res <- ifelse(tolower(sub("^(.{3}).*", "\\1", testframe$Address1)) %in% 
                         tolower(sub("^(.{3}).*", "\\1", testframe$Address2)), "Yes", "No")

    Address1 Address2 Res
1    Sunwood Sun wood Yes
2 Greengrass    green Yes
3    bluesky   sky Pl  No

Или, в принципе, так же, как идея @PoGibas:

testframe$Res <- ifelse(tolower(substring(testframe$Address1, 1, 3)) %in% 
                         tolower(substring(testframe$Address2, 1, 3)), "Yes", "No")
...