如何用stringr提取文件名内容并通过dplyr::mutate为data.frame新增列
从文件名提取字段并添加为新变量的解决方案
嘿,这个需求用dplyr加stringr就能轻松搞定!咱们先拆解你的文件名结构:./data/RevCon_2015_C1_Austria_05_06.txt里的信息是用下划线分隔的,正好对应会议名、年份、会议编号、国家、月份、日期这些你需要的字段。
步骤1:加载依赖包
首先确保你已经安装了dplyr和stringr,然后加载它们:
library(dplyr) library(stringr)
步骤2:定义正则匹配模式
先把文件名的匹配规则写成一个正则表达式,这样后面重复用的时候更方便:
# 正则解释: # [^_]+ 匹配任意非下划线的字符(提取会议名、编号、国家) # [0-9]{4} 匹配4位数字(年份) # [0-9]{2} 匹配2位数字(月、日) # \\.txt 匹配文件后缀(转义点号,避免被当作正则通配符) filename_pattern <- "./data/([^_]+)_([0-9]{4})_([^_]+)_([^_]+)_([0-9]{2})_([0-9]{2})\\.txt"
步骤3:提取字段并生成新变量
用dplyr::mutate配合stringr::str_match一次性提取所有需要的字段,还能顺便把数字类型的字段转成整数(比如年份、月份):
# 先拿出你的示例数据 df <- data.frame( paragraph = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.", filename = "./data/RevCon_2015_C1_Austria_05_06.txt", stringsAsFactors = FALSE ) # 处理数据 df_processed <- df %>% mutate( # 用str_match提取所有分组,返回一个矩阵 match_result = str_match(filename, filename_pattern), # 从矩阵中取出对应列作为新变量 conference = match_result[, 2], year = as.integer(match_result[, 3]), conf_code = match_result[, 4], country = match_result[, 5], month = as.integer(match_result[, 6]), day = as.integer(match_result[, 7]) ) %>% select(-match_result) # 删掉中间的匹配结果矩阵列
看看处理后的结果
运行print(df_processed)就能看到新增的变量:
print(df_processed)
输出示例:
paragraph filename conference year conf_code country month day 1 Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ./data/RevCon_2015_C1_Austria_05_06.txt RevCon 2015 C1 Austria 5 6
如果你的文件名有其他变体(比如部分字段可选),只需要调整正则表达式的对应部分就行,比如用?标记可选字段。
内容的提问来源于stack exchange,提问作者feder80
相关产品推荐
相关产品推荐

