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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:10:26