将正则表达式与向量组合用于R中的文本替换

时间:2018-04-23 00:36:51

标签: r regex vectorization sapply grepl

我有一个数据框,其中包含我从Spotify中删除的一系列曲目标题,艺术家和音乐类型。在R中可重复性:

a <- c("Run the World (Girls)", "LOCO", "Habits", "Never Born - 2017 Version")
b <- c("Beyoncé", "NERVO", "Marmozets", "Guano Apes")
c <- c("dance pop pop post-teen pop r&b", "australian dance big room deep big room edm electro house house progressive electro house progressive house", "alt-indie rock british alternative rock pixie", "alternative metal funk metal nu metal post-grunge rap metal rap rock")
df <- data.frame(SONG=a, ARTIST=b, GENRE=c)

编辑包含实际的表格输入和所需的输出。

这是如上所述的输入数据帧。 Original Dataframe

我想清理分析类型。目前我已经创建了一个常见类型列表:

main_genres <- c("hip hop", "pop", "country", "latin", "dance", "rock", "classical", "jazz", "indie", "folk", "metal", "reggae", "punk")

我为我最终想做的事情创建了一个新的数据框架。

all_main_genres <- data.frame(TRACK = character(), ARTIST = character(), GENRE = character())

我想知道的是,如果有一种非循环方式可以搜索GENRE dfmain_genres列中all_main_genres向量中的任何和所有字符串,如果是这样,要在GENRE中创建包含原始歌曲标题和歌曲艺术家的新行,并在新的main_genres列中创建来自{{1}的 MATCHED 类型}。

例如,all_main_genres中的第一行将是

TRACK = Run the World(Girls)

ARTIST =Beyoncé

GENRE =跳舞

这是因为GENREdf的第一行与main_genres向量中的“dance”和“pop”匹配。因为有两个匹配,all_main_genres的第二行将是:

TRACK = Run the World(Girls)

ARTIST =Beyoncé

GENRE = pop

然后第三行将是NERVO歌曲,其类型为 dance ,第三行将是Marmozets歌曲,其类型为 indie ,然后是Marmozets歌曲,带有流派摇滚等。

换句话说,它应该是这样的: Desired dataframe

我将sapply用于grepl

sapply(main_genres, grepl, playlist_genres$GENRE[row], ignore.case = TRUE)

矢量匹配有效,但我不知道如何将其扩展到gsub,并带有一个潜在替换的向量,它们本身将作为被替换的对象。 还没有看到这个与矢量,所以请原谅,如果它是一个转贴。提前谢谢。

1 个答案:

答案 0 :(得分:1)

df%>%
     tidytext::unnest_tokens(GENRE,GENRE,stringr::str_extract_all,pattern=glue::collapse(main_genres,"|"))%>%
     unique%>%
     `rownames<-`(NULL)
                       SONG     ARTIST GENRE
1     Run the World (Girls)    Beyoncé dance
2     Run the World (Girls)    Beyoncé   pop
3                      LOCO      NERVO dance
4                    Habits  Marmozets indie
5                    Habits  Marmozets  rock
6 Never Born - 2017 Version Guano Apes metal
7 Never Born - 2017 Version Guano Apes  rock

要在基础R中执行此操作:您可以这样做:

GENRE=regmatches(df$GENRE,gregexpr(paste(main_genres,collapse = "|"),df$GENRE))
unique(transform(df[rep(1:nrow(df),lengths(GENRE)),1:2],GENRE=unlist(GENRE),row.names=NULL))
                        SONG     ARTIST GENRE
1      Run the World (Girls)    Beyoncé dance
2      Run the World (Girls)    Beyoncé   pop
5                       LOCO      NERVO dance
6                     Habits  Marmozets indie
7                     Habits  Marmozets  rock
9  Never Born - 2017 Version Guano Apes metal
13 Never Born - 2017 Version Guano Apes  rock