tidyr包separate()函数正则分隔列失效问题排查
解决tidyr::separate()拆分
partijen列的正则问题 嘿,我来帮你搞定这个separate()的正则问题!你的partijen列里的分隔符有点 tricky——既有逗号加空格,还有en加空格,甚至末尾还有省略号,这就是之前正则不生效的原因。咱们一步步来解决:
第一步:先整理你的数据框
首先我把你给出的数据整理成正确的格式(看起来输入时gemeente和partijen的内容有点混淆,我帮你修正了):
library(tidyr) library(dplyr) library(stringr) # 用来处理末尾的省略号 # 修正后的原始数据框 df <- tibble( gemeente = c("Asten", "Beek", "Coevorden", "Ermelo"), partijen = c( "CDA 1 , Algemeen Belang 1 en Leefbaar Asten 1", "BBB-NDB 2, CDA 2", "PvdA 1, CDA 1 en Lokaal 1", "Progressief Ermelo 1, BurgerBelangen Ermelo 1, SGP 1 en ..." ) )
第二步:用separate_rows()拆分(推荐!)
如果你想把每个政党拆成单独的行(这是处理这类多值列最常用的方式),可以用separate_rows(),搭配能匹配两种分隔符的正则:
df_clean <- df %>% separate_rows(partijen, sep = "\\s*(?:,|en)\\s+") %>% # 去掉末尾的省略号 mutate(partijen = str_remove(partijen, "\\.\\.\\.$")) # 查看结果 print(df_clean)
正则模式解释:
\\s*:匹配0个或多个空格,处理像CDA 1 ,里逗号前后的多余空格(?:,|en):非捕获组,匹配逗号或者en这两种分隔符\\s+:匹配1个或多个空格,处理分隔符后面的空格(比如, Algemeen...或en Leefbaar...)
如果你想拆分成多列(而不是行)
如果你的需求是把每个政党拆成单独的列,需要先预估最多有多少个政党(这里假设最多4个),用separate():
df_cols <- df %>% separate( partijen, into = paste0("partij_", 1:4), # 生成列名partij_1到partij_4 sep = "\\s*(?:,|en)\\s+", fill = "right" # 政党数量不足时,右侧补NA ) %>% # 去掉所有列里的省略号 mutate(across(starts_with("partij_"), ~str_remove(., "\\.\\.\\.$"))) # 查看结果 print(df_cols)
为什么之前的正则不生效?
大概率是因为你只匹配了单一分隔符(比如只写了","或者只写了"en"),没考虑到列里同时存在两种分隔方式,也没处理分隔符前后的空格——这些细节都会导致正则匹配失败。
特殊情况注意
如果你的政党名称里本身包含en(比如某个政党叫VVD en GroenLinks),这个正则会误拆分。这时候可以换个思路,根据「政党名称 + 数字」的格式来匹配,用str_extract_all()提取每个条目:
df %>% mutate(partijen = str_extract_all(partijen, "[A-Za-z\\-\\s]+ \\d+")) %>% unnest(partijen)
内容的提问来源于stack exchange,提问作者Tdebeus
相关产品推荐
相关产品推荐

