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
相关产品推荐
相关产品推荐

