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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:24:01