如何使用R批量提取df单元格内俄罗斯国家杜马政党得票数值?
解决方案
你的单元格内容结构固定为「百分比+空格+得票数+空格+гол.」,可以用正则表达式精准提取目标数值,批量处理15个数据框全程不需要手动操作,15000条数据几秒钟就能处理完成。
单数据框处理示例
核心逻辑是用正则匹配后面跟着 гол.的连续数字,完全不会误提取百分比的数值:
# 先加载依赖包,没有安装的话先运行install.packages("tidyverse") library(tidyverse) # 假设你的单个原始数据框名为df processed_df <- df %>% # 批量处理列:如果所有列都是要提取的投票列,保留everything();如果只有部分列需要处理,可以换成列匹配规则,比如starts_with("UR_")、c("UR_yes","UR_no")等 mutate(across(everything(), # 正则匹配后转数值格式 ~ str_extract(., "\\d+(?=\\sгол\\.)") %>% as.numeric() ))
如果部分单元格的后缀存在格式差异(比如空格数量不同、гол后面没有点),可以用更兼容的规则,直接提取字符串中最后一组连续数字即可(你的数据里得票数永远是最后一组数字):~ str_extract(., "\\d+$") %>% as.numeric()
批量处理15个数据框
你可以把所有数据框放入列表统一处理,处理完再单独导出或者放回全局环境:
# 如果你已经把15个原始数据框读入了R环境,命名为df1、df2...df15的话 df_list <- mget(paste0("df", 1:15)) # 批量处理所有数据框 processed_list <- map(df_list, function(x) { x %>% mutate(across(everything(), ~ str_extract(., "\\d+(?=\\sгол\\.)") %>% as.numeric())) }) # 处理完成后将15个结果放回全局环境,命名规则为processed_df1、processed_df2... list2env(setNames(processed_list, paste0("processed_", names(processed_list))), envir = .GlobalEnv)
如果你的15个数据框还存在本地的Excel/CSV文件里,可以直接批量读入-处理-导出,不需要先单独读入环境:
# 加载读写Excel的包,没安装先运行install.packages(c("readxl","writexl")) library(readxl) library(writexl) # 假设所有原始文件都存放在./vote_data/文件夹下 file_paths <- list.files("./vote_data/", pattern = "\\.xlsx$", full.names = TRUE) # 批量处理所有文件,处理后自动导出到同文件夹,加processed前缀 walk(file_paths, function(path) { temp_df <- read_xlsx(path) temp_processed <- temp_df %>% mutate(across(everything(), ~ str_extract(., "\\d+(?=\\sгол\\.)") %>% as.numeric())) write_xlsx(temp_processed, paste0("./vote_data/processed_", basename(path))) })
注意事项
- 如果数据框中存在不需要处理的列(比如法案编号、投票日期等),只需要修改
across()里的列选择规则即可,不会影响其他列 - 如果提取后出现NA值,只需要检查对应单元格的格式,微调正则匹配规则就能解决
内容的提问来源于stack exchange,提问作者w5698
相关产品推荐
相关产品推荐

