如何拆分R数据框某列中连写的状态字符串
拆分维基百科爬取数据中Status列的连写字段
你爬取得到的tb_abia数据框里,Status列的字符串是连写形式(比如"Incumbent renominatedNew member electedLP gain"),可以通过正则表达式匹配大写字母开头的短语边界来拆分,下面是两种实用的实现方式:
方式1:拆分为多行(每个状态单独一行)
适合需要把每个状态项单独作为一条记录的场景,用tidyverse工具链实现:
library(tidyverse) # 处理Status列:在大写字母开头的短语前插入空格,再拆分转为多行 tb_abia_cleaned <- tb_abia %>% mutate(Status_formatted = str_replace_all(Status, "(?=[A-Z])", " ") %>% str_trim()) %>% separate_rows(Status_formatted, sep = "\\s+(?=[A-Z])") # 查看拆分后的结果 tb_abia_cleaned$Status_formatted
运行后,原示例中的两个Status值会被拆分为独立项:
- "Incumbent renominated"
- "New member elected"
- "LP gain"
- "Incumbent retired"
- "New member elected"
- "LP gain"
方式2:拆分为多列(每个状态单独一列)
如果需要把拆分后的状态放在不同列中,可以用separate函数指定列名:
library(tidyverse) # 处理Status列并拆分为对应含义的列 tb_abia_cleaned <- tb_abia %>% mutate(Status_formatted = str_replace_all(Status, "(?=[A-Z])", " ") %>% str_trim()) %>% separate(Status_formatted, into = c("Incumbent_Status", "Election_Outcome", "Party_Gain"), sep = "\\s+(?=[A-Z])", fill = "right") # 查看结果 tb_abia_cleaned
这种方式会将拆分出的内容分别放到Incumbent_Status、Election_Outcome、Party_Gain列中,不足的位置自动填充NA。
正则逻辑说明
(?=[A-Z])是正向预查规则,匹配后面紧跟着大写字母的位置,在这些位置插入空格,就能把连写的短语分开;\\s+(?=[A-Z])则匹配一个或多个空格且后面跟着大写字母的位置,用来作为拆分的分隔符。
内容的提问来源于stack exchange,提问作者Bashir Abubakar
相关产品推荐
相关产品推荐

