如何遍历数据框列表并将名称数字部分设为数据框新列值?
解决方案
问题描述
我有一个数据框列表,列表元素名称分别为"data frame - 12345 - App"、"data frame - 34567 - App"、"data frame - 65849",每个数据框结构如下:
Col1|Col2 |Col3 Row1 Info1 NewInfo1 Row2 Info2 NewInfo2
需要将每个列表元素名称中的数字提取出来,作为新列ID Name添加到对应数据框的每一行,最终得到带ID列的数据框。
实现代码
方法1:使用tidyverse工具(推荐)
先模拟数据框列表(如果已有真实列表可跳过这步):
# 构造示例数据框 df <- data.frame( Col1 = c("Row1", "Row2"), Col2 = c("Info1", "Info2"), Col3 = c("NewInfo1", "NewInfo2") ) # 构造目标列表 df_list <- list( "data frame - 12345 - App" = df, "data frame - 34567 - App" = df, "data frame - 65849" = df )
使用purrr::imap遍历列表,同时获取数据框和对应名称,提取数字并添加新列:
library(purrr) library(stringr) df_list_with_id <- imap(df_list, function(df, list_name) { # 从列表名称中提取连续数字 id <- str_extract(list_name, "\\d+") # 添加ID Name列 df$`ID Name` <- id df }) # 查看第一个数据框的结果 print(df_list_with_id[[1]])
方法2:基础R循环
如果不想加载额外包,用基础R也能实现:
df_list_with_id <- df_list for (name in names(df_list_with_id)) { # 提取名称中的数字部分 id <- regmatches(name, regexpr("\\d+", name)) # 为当前数据框添加ID列 df_list_with_id[[name]]$`ID Name` <- id }
说明
- 正则表达式
\\d+会匹配名称中所有连续的数字,不管数字前后的文本格式如何,都能准确提取目标ID。 - 两种方法都会保留原列表的结构,每个数据框都会新增
ID Name列,值对应列表名称中的数字。
内容的提问来源于stack exchange,提问作者user35131
相关产品推荐
相关产品推荐

