如何在R语言中从movies数据框title列提取年份至year列?
嘿,我来帮你搞定这个提取电影年份的需求!处理超1万条数据的话,得用高效又靠谱的方法,下面两种方案都能快速完成任务,你可以根据自己的习惯选:
方案一:用tidyverse(stringr + dplyr)处理
这个方案语法清晰,字符串处理能力强,适合习惯tidy风格的用户。如果还没安装tidyverse,先运行install.packages("tidyverse")安装。
# 加载tidyverse包 library(tidyverse) # 同时清理title列并提取年份 movies <- movies %>% mutate( # 提取括号内的4位数字作为年份,转成数值型 year = as.numeric(str_extract(title, "\\((\\d{4})\\)") %>% str_remove_all("[()]")), # 移除title里的"(年份)"部分,\\s*处理标题和括号间可能的空格 title = str_remove(title, "\\s*\\(\\d{4}\\)") )
代码解释:
str_extract(title, "\\((\\d{4})\\)"):精准匹配标题里括号包裹的4位数字(也就是年份)str_remove_all("[()]"):把提取到的"(2017)"这类字符串里的括号去掉,得到纯数字str_remove(title, "\\s*\\(\\d{4}\\)"):移除标题末尾的年份部分,\\s*确保即使标题和括号之间有空格也能正确处理(比如"Movie Name (2020)")
方案二:用Base R原生函数处理
如果不想加载额外的包,用Base R的正则函数就能搞定,速度同样高效:
# 提取年份:用sub捕获括号内的4位数字 movies$year <- as.numeric(sub(".*\\((\\d{4})\\).*", "\\1", movies$title)) # 清理title列:移除"(年份)"部分 movies$title <- sub("\\s*\\(\\d{4}\\)", "", movies$title)
代码解释:
sub(".*\\((\\d{4})\\).*", "\\1", movies$title):正则表达式里的\\1代表捕获到的第一个分组(也就是括号里的4位数字),直接提取出来作为年份sub("\\s*\\(\\d{4}\\)", "", movies$title):和方案一逻辑一致,移除标题里的年份后缀
额外注意事项
如果你的数据里存在部分没有年份的标题(比如"Unknown Movie"),可以加个判断避免出错:
用tidyverse处理缺失情况:
movies <- movies %>% mutate( # 先判断标题是否包含标准年份格式 has_year = str_detect(title, "\\(\\d{4}\\)"), # 有年份就提取,没有就设为NA year = ifelse(has_year, as.numeric(str_extract(title, "\\((\\d{4})\\)") %>% str_remove_all("[()]")), NA), # 有年份就清理标题,没有就保持原样 title = ifelse(has_year, str_remove(title, "\\s*\\(\\d{4}\\)"), title) )
用Base R处理缺失情况:
# 标记有年份的条目 has_year <- grepl("\\(\\d{4}\\)", movies$title) # 提取年份,无年份的设为NA movies$year <- NA movies$year[has_year] <- as.numeric(sub(".*\\((\\d{4})\\).*", "\\1", movies$title[has_year])) # 清理有年份的标题 movies$title[has_year] <- sub("\\s*\\(\\d{4}\\)", "", movies$title[has_year])
这两种方案处理1万条数据都毫无压力,运行速度很快,你可以放心用!
内容的提问来源于stack exchange,提问作者Quido W
相关产品推荐
相关产品推荐

