仅当完全匹配不存在时才进行模糊匹配

时间:2018-02-28 21:26:46

标签: r regex dplyr agrep

我正在尝试编写一个函数来从Spotify的API中获取专辑和艺术家数据框的专辑数据。因为数据集中有一些拼写错误,我需要使用模糊匹配函数(如agrepl)。

但是,像Absu这样的一些艺术家的专辑也是agrepl的标准。例如,Absu有一张名为“Absu”的专辑,另一张名为“Abzu”。我只想要其中1个的数据,但我最终会得到两者的数据。我知道您可以在max.distance中更改agrepl,但我需要将其设置得相当低,以应对更大的拼写错误。

是否有预先建立的功能或简单的方法告诉R

如果album_namemydata[["Album"]]过滤器完全匹配,请继续 else:尝试找到一个匹配过滤器?

这是我尝试过的,但不起作用:

get_album_data <- function(x) {

  get_artist_audio_features(mydata$Artist[x], return_closest_artist = TRUE) %>% 
    ifelse(album_name %in% mydata$Album[x],
           filter(mydata$Album[x] == album_name,
           filter(agrepl(mydata$Album[x], album_name, ignore.case = TRUE))))

}

这是我的代码看起来没有尝试任何特殊的东西

library(dplyr)
library(spotifyr)
library(purrr)

# from Spotify's developer page
Sys.setenv(SPOTIFY_CLIENT_ID = "xxx")
Sys.setenv(SPOTIFY_CLIENT_SECRET = "xxx")
access_token <- get_spotify_access_token()

Artist <- c("Spiritualized", "Fleet Foxes", "The Avalanches", "Absu")
Album <- c("Sweet Heart, Sweet Light", "Helplessness Blues", "Wildflower", "Abzu")

mydata <- data_frame(Artist, Album)

get_album_data <- function(x) {
  get_artist_audio_features(mydata[["Artist"]][x], return_closest_artist = TRUE) %>% 
    filter(agrepl(mydata[["Album"]][x], album_name, ignore.case = TRUE)) %>%
    mutate(mydata[["Artist"]][x])
}

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:0)

也许您可以先过滤出完全匹配的相册。

artist_with_exact_matches = mydata$Artist[which(mydata$Artist %in% mydata$Album), ]
mydata_fuzzy_match = mydata[-which(mydata$Artist %in% artist_with_exact_matches), ]

然后使用模糊匹配找到其余艺术家和专辑的匹配。