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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:19:09