在R中如何为多个dataframe添加等于其名称末位数字的survey变量
你可以通过将所有目标数据框存入列表批量处理,这是R中处理多同结构数据框的最优方案,以下是可直接运行的代码:
# 示例数据 yng1 <- as.data.frame(c(1:4)) yng2 <- as.data.frame(c(5:8))
方法1:tidyverse 实现(代码更简洁)
library(purrr) library(stringr) library(dplyr) # 1. 抓取全局环境中所有yng+数字命名的数据框,存入列表 df_list <- mget(ls(pattern = "^yng\\d+$")) # 2. 批量为每个数据框添加survey列:取值为对应名称最后一位的数字 df_list <- imap(df_list, ~ mutate(.x, survey = as.integer(str_extract(.y, "\\d$")))) # 3. (可选)将处理后的所有数据框放回全局环境,覆盖原有对象 list2env(df_list, envir = .GlobalEnv)
方法2:base R 实现(无需加载额外包)
之前for循环失败通常是因为直接遍历字符串类型的对象名,没有通过get()获取对应对象、assign()回写结果导致的,以下循环方法已经规避了这个问题:
# 1. 匹配所有目标数据框名称 df_names <- ls(pattern = "^yng\\d+$") # 2. 循环处理每个数据框 for (name in df_names) { # 获取当前数据框 df <- get(name) # 提取名称最后一位数字作为survey值 df$survey <- as.integer(substr(name, nchar(name), nchar(name))) # 赋值回全局环境 assign(name, df) }
适配说明
如果你的数据框命名是yng+多位数(如yng10、yng11),只需调整数字提取规则即可:
- tidyverse版本将
str_extract(.y, "\\d$")改为str_extract(.y, "(?<=yng)\\d+") - base R版本将
substr(name, nchar(name), nchar(name))改为sub("yng", "", name)
运行上述代码后,查看yng1、yng2即可得到预期输出。
内容的提问来源于stack exchange,提问作者Bicep
相关产品推荐
相关产品推荐

