You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中结合正则表达式与向量实现文本替换:Spotify数据处理

用正则表达式与向量清理Spotify流派数据

针对你从Spotify抓取的包含曲目、艺术家和流派的数据框,我会一步步展示如何用正则表达式和向量完成文本替换与清理工作。首先我们先完整复现你的数据:

# 构建数据框
tracks <- data.frame(
  曲目 = c("Run the World (Girls)", "LOCO", "Habits", "Never Born - 2017 Version"),
  艺术家 = c("Beyoncé", "NERVO", "Marmozets", "Guano Apes"),
  流派 = 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 me...")
)

接下来我们分几个核心场景处理:

1. 修复截断的流派名称

你最后一条数据里的funk me...是截断的流派名,我们可以用正则表达式移除无效后缀,或者根据上下文替换为完整名称:

# 方式1:移除末尾的" me..."截断部分
tracks$流派 <- gsub(" me\\.\\.\\.$", "", tracks$流派)

# 方式2:如果推测是"funk metal",直接替换
# tracks$流派 <- gsub("funk me\\.\\.\\.", "funk metal", tracks$流派)

2. 去重重复的流派

第二条数据里多次出现big room、house等重复流派,我们可以写一个小函数实现单条记录内的流派去重:

# 定义去重函数
去重流派 <- function(流派字符串) {
  # 按空格拆分流派
  流派列表 <- strsplit(流派字符串, "\\s+")[[1]]
  # 去重后重新拼接
  paste(unique(流派列表), collapse = " ")
}

# 应用到整个流派列
tracks$流派 <- sapply(tracks$流派, 去重流派)

3. 标准化流派术语

如果需要统一流派命名(比如alt-indie rock改为alternative indie rock),可以用命名向量批量替换:

# 加载stringr包(需要先安装:install.packages("stringr"))
library(stringr)

# 定义替换规则的命名向量
替换规则 <- c(
  "alt-indie rock" = "alternative indie rock",
  "big room deep" = "deep big room"
)

# 批量替换
tracks$流派 <- str_replace_all(tracks$流派, 替换规则)

4. 拆分流派为列表/多列

如果需要进一步分析单个流派,可以把流派拆分为列表列,或者固定数量的多列:

# 拆分为列表列(每个元素是该曲目的流派向量)
tracks$流派列表 <- strsplit(tracks$流派, "\\s+")

# 拆分为固定多列(先找到最大流派数量)
最大流派数 <- max(sapply(tracks$流派列表, length))
流派列矩阵 <- do.call(rbind, lapply(tracks$流派列表, function(x) {
  length(x) <- 最大流派数
  x
}))
colnames(流派列矩阵) <- paste0("流派_", 1:最大流派数)

# 合并到原数据框
tracks <- cbind(tracks, 流派列矩阵)

经过以上处理,你的流派数据就会变得整洁规范,方便后续分析啦!

内容的提问来源于stack exchange,提问作者chainhomelow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:55:33