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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:31:40