Приблизительное сопоставление и обновление текста одновременно

У меня есть фрейм данных как df1, который содержит столбец с названием университета как University_name и имеет 500000 строк. Теперь у меня есть другой фрейм данных как df2, который содержит 2 столбца, как имя_университета и имя_университета, и содержит 150 строк. Теперь я хочу сопоставить каждый псевдоним университета, присутствующий в столбце university_aliases, с именами университетов, представленными в university_name_new.

образец df1$ имя_университета

university of auckland
the university of auckland
university of warwick - warwick business school
unv of warwick
seneca college of applied arts and technology
seneca college
univ of auckland

образец df2

University_Alias                  Univeristy_Name_new

univ of auckland                  university of auckland
universiry of auckland            university of auckland
auckland university               university of auckland
university of auckland            university of auckland
warwick university                university of warwick
warwick univercity                university of warwick
university of warwick             university of warwick
seneca college                    seneca college
unv of warwick                    university of warwick

Я ожидаю такой выходной

university of auckland
university of auckland
university of warwick
seneca college
seneca college

и я использую следующий код, но он не работает

 df$university_name[ grepl(df$university_name,df2$university_alias)] <- df2$university_name_new

2 ответа

Решение

Ты можешь использовать sapply а также str_extract чтобы получить желаемый результат.

 # create sample data
df1 <- data.frame(university_name = c('university of auckland',
                                      'the university of auckland',
                                      'university of warwick - warwick business school',
                                      'seneca college of applied arts and technology',
                                      'seneca college'), stringsAsFactors = F)

# these are values to match (from df2)
vals <- c('university of auckland','university of warwick','seneca college')

# get the output
df1$output <- sapply(df1$university_name, function(z)({

    f <- vals[complete.cases(str_extract(string = z, pattern = vals))]
    return(f)

}), USE.NAMES = F)

print(df1)

                                  university_name                 output
1                          university of auckland university of auckland
2                      the university of auckland university of auckland
3 university of warwick - warwick business school  university of warwick
4   seneca college of applied arts and technology         seneca college
5                                  seneca college         seneca college

Обновить:

Исходя из моего понимания, df2 уже имеет один в один отображение university_alias с university_name_new, так что эта проблема сводится к проверке, если в поле df1 отсутствует university_alias, мы удаляем его.

# check values for university_alias in university_name
maps2 <- as.character(df2$university_alias[which(df2$university_alias %in% df1$university_name)])

# remove unmatched rows from df2
df3 <- df2[df2$university_alias %in% maps2,]

print(df3)
            university_alias    university_name_new
1           univ of auckland university of auckland
4     university of auckland university of auckland
8             seneca college         seneca college
9             unv of warwick  university of warwick

Вы могли бы сделать это

df2$University_Name_new[which(is.element(df2$University_Alias, df1$university_name))]
### which returns the following ####
[1] "university of auckland" "seneca college" 

Теперь, например, в данных, которые вы предоставили the university of auckland в df1$university_name но не в df2$University_AliasВот почему мы имеем следующее:

> which(is.element(df2$University_Alias, df1$university_name))
[1] 4 8

Действительно, из df1$university_name, только university of auckland а также seneca college содержатся в df2$University_Alias,

Другие вопросы по тегам