如何为R列表中数据框批量创建wind和ROS变量(基于元素名)
为列表中的数据框批量添加wind和ROS变量
核心思路
通过提取列表元素的名称,用正则表达式匹配wind和ROS后的数字串,转换为目标数值(如084→0.84),再给每个数据框添加这两个变量。
示例数据
先构造一个和需求匹配的示例列表:
list_df <- list( mean_AST_wind084_ROS007 = data.frame(a = 1:3, b = 4:6), mean_AST_wind177_ROS01 = data.frame(a = 7:9, b = 10:12) )
方法一:Base R实现
# 遍历列表名称,批量处理每个数据框 list_df_new <- lapply(names(list_df), function(name) { # 提取wind对应的数字并转换为0.xx格式 wind_val <- as.numeric(sub(".*wind(\\d+).*", "\\1", name)) / 100 # 提取ROS对应的数字并转换为0.xx格式 ros_val <- as.numeric(sub(".*ROS(\\d+).*", "\\1", name)) / 100 # 为当前数据框添加新变量 current_df <- list_df[[name]] current_df$wind <- wind_val current_df$ROS <- ros_val current_df }) # 恢复原列表的元素名称 names(list_df_new) <- names(list_df)
方法二:用purrr包简化代码
如果习惯用tidyverse工具链,purrr::imap可以同时获取数据框和对应的名称,代码更简洁:
library(purrr) library(stringr) list_df_new <- imap(list_df, function(df, elem_name) { # 用正向预查提取wind后的数字 wind_val <- as.numeric(str_extract(elem_name, "(?<=wind)\\d+")) / 100 # 提取ROS后的数字 ros_val <- as.numeric(str_extract(elem_name, "(?<=ROS)\\d+")) / 100 df$wind <- wind_val df$ROS <- ros_val df })
正则说明
.*wind(\\d+).*:匹配任意字符,捕获wind后的连续数字组,通过\\1提取(?<=wind)\\d+:正向预查,仅匹配wind后面的连续数字(无需额外处理前后字符)- 除以100是为了将
084转为0.84、01转为0.01,完全匹配需求
内容的提问来源于stack exchange,提问作者Raquel Feltrin
相关产品推荐
相关产品推荐

