我有一个数据框,其中包含我从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)
编辑包含实际的表格输入和所需的输出。
我想清理分析类型。目前我已经创建了一个常见类型列表:
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
df
列main_genres
列中all_main_genres
向量中的任何和所有字符串,如果是这样,要在GENRE
中创建包含原始歌曲标题和歌曲艺术家的新行,并在新的main_genres
列中创建来自{{1}的 MATCHED 类型}。
例如,all_main_genres
中的第一行将是
TRACK = Run the World(Girls)
ARTIST =Beyoncé
GENRE =跳舞
这是因为GENRE
中df
的第一行与main_genres
向量中的“dance”和“pop”匹配。因为有两个匹配,all_main_genres
的第二行将是:
TRACK = Run the World(Girls)
ARTIST =Beyoncé
GENRE = pop
然后第三行将是NERVO歌曲,其类型为 dance ,第三行将是Marmozets歌曲,其类型为 indie ,然后是Marmozets歌曲,带有流派摇滚等。
我将sapply
用于grepl
sapply(main_genres, grepl, playlist_genres$GENRE[row], ignore.case = TRUE)
矢量匹配有效,但我不知道如何将其扩展到gsub
,并带有一个潜在替换的向量,它们本身将作为被替换的对象。
还没有看到这个与矢量,所以请原谅,如果它是一个转贴。提前谢谢。
答案 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