R语言如何从列表内的dataframe名称中提取数字并写入对应列?
解决方案
核心问题说明
你之前代码的问题在于sapply直接遍历列表时,传入匿名函数的x是列表存储的dataframe本身,无法直接获取到列表元素对应的名称,自然无法提取名称中的日期字段。你写的x[8]实际是取dataframe的第8列,完全不符合提取名称字符的需求。
推荐实现方法
方法1:purrr包实现(代码更简洁)
如果可以使用tidyverse体系的purrr包,用imap函数可以同时遍历列表的元素值和对应名称,是容错率最高的方案:
library(purrr) library(stringr) list.data <- imap(list.data, function(df, df_name){ # 从名称中提取下划线后的8位日期数字,适配前缀长度不固定的场景 date_str <- str_extract(df_name, "(?<=_)\\d{8}") df$Date <- as.numeric(date_str) return(df) })
如果确认所有列表名称的日期都固定在第7到14位字符位置,也可以替换成固定位置取字符的写法:
date_str <- substr(df_name, 7, 14)
方法2:基础R实现(无需额外安装包)
用索引遍历列表,同时取对应位置的名称和dataframe即可:
for(i in seq_along(list.data)){ # 取当前元素的名称 df_name <- names(list.data)[i] # 提取日期 date_str <- regmatches(df_name, regexpr("(?<=_)\\d{8}", df_name, perl=TRUE)) list.data[[i]]$Date <- as.numeric(date_str) }
结果验证
处理完成后可以用以下代码抽查结果是否正确:
# 对比第一个dataframe的名称和对应Date列值 names(list.data)[1] head(list.data[[1]]$Date)
内容的提问来源于stack exchange,提问作者Sherece
相关产品推荐
相关产品推荐

