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

R语言如何将表格中混合的频数百分比列拆分为独立两列

R实现频数百分比混合列拆分方案

依赖环境

  • 推荐使用tidyverse套件实现,批量处理更简洁,未安装可先执行install.packages("tidyverse")

核心实现代码

你提到的三列都是「数字(数字%)」的统一格式,用正则匹配拆分效率最高:

library(tidyverse)

# 替换为你自己的数据集读入代码即可,比如read.csv("你的表格路径.csv")
raw_df <- 你的原始数据集

# 定义需要拆分的列名,和你表格里的实际列名完全对应即可
cols_to_split <- c("vaccinated = 0 (n=16455)", "vaccinated = 1 (n=1297)", "Total (n=17752)")

# 批量拆分处理
result_df <- raw_df %>%
  across(all_of(cols_to_split),
         ~ separate_wider_regex(
           .,
           patterns = c(freq = "\\d+", "\\(", pct = "[0-9.]+%", "\\)"),
           names_sep = "_"
         ),
         .names = "{.col}_{.value}"
  ) %>%
  # 转换为数值格式方便后续统计计算
  mutate(
    across(ends_with("_freq"), as.integer),
    across(ends_with("_pct"), ~as.numeric(str_remove(., "%")))
  )

代码说明

  • 所有不在cols_to_split里的列(比如你的variable列等)会完整保留,不会被修改
  • 拆分后的新列命名规则为原列名_freq(频数列)、原列名_pct(百分比列,已去掉%符号转为数值)
  • 如果需要保留原始的混合格式列,可以在across函数外加上.keep = "all"参数

老版本tidyr兼容方案

如果你的tidyr版本低于1.2.0无法使用separate_wider_regex,可以用以下写法逐列拆分:

result_df <- raw_df %>%
  # 拆分未接种组列
  separate(`vaccinated = 0 (n=16455)`, into = c("vaccinated_0_freq", "vaccinated_0_pct"), sep = "\\(", remove = F) %>%
  mutate(vaccinated_0_pct = str_remove(vaccinated_0_pct, "\\)%"), vaccinated_0_freq = as.integer(vaccinated_0_freq)) %>%
  # 拆分接种组列
  separate(`vaccinated = 1 (n=1297)`, into = c("vaccinated_1_freq", "vaccinated_1_pct"), sep = "\\(", remove = F) %>%
  mutate(vaccinated_1_pct = str_remove(vaccinated_1_pct, "\\)%"), vaccinated_1_freq = as.integer(vaccinated_1_freq)) %>%
  # 拆分合计列
  separate(`Total (n=17752)`, into = c("Total_freq", "Total_pct"), sep = "\\(", remove = F) %>%
  mutate(Total_pct = str_remove(Total_pct, "\\)%"), Total_freq = as.integer(Total_freq))

内容的提问来源于stack exchange,提问作者Mari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:15:01