Приблизительное сопоставление и обновление текста одновременно
У меня есть фрейм данных как 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
,