Вот одна 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")