R语言如何拆分单列存储多政党信息的DataFrame行生成独立新行
R实现tibble多值列拆分(按政党条目分行)
实现思路
- 先清洗Party列的冗余字符:移除部分条目首尾多余的双引号、去除空白干扰字符
- 按换行符拆分Party列,将每个政党条目展开为独立行,其余列数据保持原样
- 可选扩展:将政党名称和对应任期拆分为独立列,方便后续分析
完整实现代码
# 加载依赖包,未安装的话先运行 install.packages("tidyverse") library(tidyverse) # 读入示例数据(你提供的structure代码运行后生成的对象名为df) df <- structure(list(`First name` = c("Raynell", "Salma", "Michèle", "Denise", "Diane", "Wanda Thomas"), `Last name` = c("Andreychuk", "Ataullahjan", "Audette", "Batters", "Bellemare", "Bernard"), Username = c("SenAndreychuk", "SenatorSalma", "michele_audette", "denisebatters", "sendbellemare", "SenatorWanda"), TwitterID = c("902575098", "498059173", "948136886", "2422634642", "1426402920", "831610134262665216" ), Party = c("Conservative Party of Canada (2004/02/02 - 2019/08/13)\r\r\nProgressive Conservative Party (1993/03/11 - 2004/02/01)", "Conservative Party of Canada (2010/07/09 - )", "Independent Senators Group (2021/09/27 - )\r\r\nNon-affiliated (2021/07/29 - 2021/09/26)", "Conservative Party of Canada (2013/01/25 - )", "\"Canadian Senators Group (2019/11/04 - )\r\nIndependent Senators Group (2018/02/28 - 2019/11/03)\r\nNon-affiliated (2018/02/15 - 2018/02/27)\"", "Progressive Senate Group (2020/07/08 - )\r\r\nIndependent Senators Group (2017/06/01 - 2020/07/07)\r\r\nNon-affiliated (Independent Senators Group) (2017/03/30 - 2017/05/31)\r\r\nNon-affiliated (2016/11/10 - 2017/03/29)" ), Chamber = c("Senate", "Senate", "Senate", "Senate", "Senate", "Senate"), Country = c("Canada", "Canada", "Canada", "Canada", "Canada", "Canada"), `Legislative period` = c("1993/03/11 - 2019/08/13", "2010/07/09 -", "2021/07/29 -", "2013/01/25 -", "2012/09/06 -", "2016/11/10 -"), Notes = c("NA", "NA", "NA", "NA", "NA", "NA")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) # 核心处理代码 df_result <- df %>% # 清理Party列首尾多余的双引号、无效空白 mutate(Party = str_remove_all(Party, '^"|"$') %>% str_squish()) %>% # 按换行符拆分Party列为多行,兼容\r\n、\n两种换行格式 separate_rows(Party, sep = "\\r?\\n") %>% # 【可选步骤】拆分政党名称和任期,不需要可直接删除下面两行 separate(Party, into = c("Party Name", "Party Term"), sep = " (?=\\()", extra = "merge") %>% mutate(`Party Term` = str_remove_all(`Party Term`, "^\\(|\\)$"))
说明
处理后原6行数据会扩展为14行,每个政党任职条目单独占一行,其余字段和原行完全一致。如果保留可选拆分步骤,会额外生成两列分别存储政党名称和对应任期,无需手动提取。
之前使用ifelse无法实现需求是因为该函数是逐行条件判断函数,只能对每个输入返回单个结果,无法处理单个单元格内多值的拆分展开需求,这类长/宽表转换场景直接使用tidyr包的separate_rows函数是最简便的方案。
内容的提问来源于stack exchange,提问作者Quantizer
相关产品推荐
相关产品推荐

