ваша заметка в комментариях предполагает, что ваша реальная проблема более сложна. Есть некоторая предварительная обработка, которую вы можете выполнить со своими строками, прежде чем сравнивать p1
с p2
. Вы будете иметь опыт работы с доменом, чтобы знать, какие шаги уместны, но вот первое начало. Я удаляю все интервалы и знаки препинания из p1
и p2
. Затем я проверяю их все в верхнем регистре, прежде чем проверять на равенство. Вы можете изменить функцию clean_str
, включив в нее дополнительные / различные операции очистки.
Кроме того, вы можете рассмотреть примерное соответствие для опечаток адресов / разговорных соглашений об именах. Пакет stringdist - хорошее место для старта.
mydf <- data.frame(p1=c('New York','New York','New York','TokYo','LosAngeles','MEMPHIS','memphis','ChIcAGo','Cleveland'),
p2=c('new York','New.York','MEMPHIS','Chicago','knoxville','tokyo','LosAngeles','Chicago','CLEVELAND'),
value=c(10,20,10,11,12,13,14,15,16),
stringsAsFactors = FALSE)
mydf[mydf$p1 != mydf$p2,]
#> p1 p2 value
#> 1 New York new York 10
#> 2 New York New.York 20
#> 3 New York MEMPHIS 10
#> 4 TokYo Chicago 11
#> 5 LosAngeles knoxville 12
#> 6 MEMPHIS tokyo 13
#> 7 memphis LosAngeles 14
#> 8 ChIcAGo Chicago 15
#> 9 Cleveland CLEVELAND 16
clean_str <- function(col){
#removes all punctuation
d <- gsub("[[:punct:][:blank:]]+", "", col)
d <- toupper(d)
return(d)
}
mydf$p1 <- clean_str(mydf$p1)
mydf$p2 <- clean_str(mydf$p2)
mydf[mydf$p1 != mydf$p2,]
#> p1 p2 value
#> 3 NEWYORK MEMPHIS 10
#> 4 TOKYO CHICAGO 11
#> 5 LOSANGELES KNOXVILLE 12
#> 6 MEMPHIS TOKYO 13
#> 7 MEMPHIS LOSANGELES 14
Создан в 2020-05-03 пакетом Представления (v0.3.0)