在循环中使用agrepl - 'pattern'具有长度> 1,只使用第一个元素

时间:2018-02-02 06:12:58

标签: r regex dplyr purrr agrep

我正在尝试浏览艺术家和专辑列表,并将每张专辑的每首歌曲的音频功能都放入数据框(使用spotifyr包)。但是,在我的列表中,有一些错误的专辑标题,所以我试图使用agrep或agrepl进行模糊匹配

例如:

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

Artist <- c("Eminem", "Spiritualized")
Album <- c("Revival", "Pure Phase")
mydata <- data_frame(Artist, Album)

来自spotifyr的get_artist_audio_features()功能可以为艺术家的每首歌曲提供音频功能,但我只想要来自某个特定专辑的歌曲。

get_album_data <- function(x) {
  get_artist_audio_features(mydata$Artist[x]) %>%
    filter(agrepl(album_name, mydata$Album[x]) == TRUE)}

try_get_album_data <- function(x) {
  tryCatch(get_album_data(x), error = function(e) {data.frame()})}

map_df(seq(1,2), try_get_album_data)

当我运行时,我收到错误:

...argument 'pattern' has length > 1 and only the first element will be used

有什么想法吗?我知道我需要以某种方式遍历agrepl,但我不确定如何在filter()函数中实现它,或者如果我甚至需要filter()

1 个答案:

答案 0 :(得分:1)

事实证明,agrepl首先采用模式,然后采用向量,所以在这种情况下,它应该是:

filter(agrepl(mydata$Album[x], album_name) == TRUE)}

而不是

filter(agrepl(album_name, mydata$Album[x]) == TRUE)}