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

如何调整正则表达式,用tidyr::separate在最后一个下划线后拆分字符串?

解决在最后一个下划线后拆分变量的问题

我懂你卡在哪了——虽然知道这和split-string-with-tidyrseparate是同类问题,但就是摸不准正则表达式怎么写对吧?刚好我之前处理过一模一样的场景,给你一步步来:

首先咱们先模拟一个和你数据结构类似的例子,方便你对照调整:

library(tidyverse)

# 模拟你的重复列数据
df <- tibble(
  id = 1:3,
  temp_high = c(25, 28, 26),
  temp_low = c(15, 17, 16),
  pressure_morning = c(1013, 1012, 1015),
  pressure_afternoon = c(1011, 1010, 1014)
)

第一步先把宽格式转成你说的“melt”格式(现在tidyr更推荐用pivot_longer,比老的gather更灵活):

# 转成长格式,把所有变量名合并到一列
df_long <- df %>%
  pivot_longer(-id, names_to = "combined_var", values_to = "value")

重点来了!拆分变量名的时候,要精准定位最后一个下划线,这里用的正则表达式是_(?=[^_]+$),它的逻辑是:匹配那个后面跟着“非下划线字符直到字符串结尾”的下划线——也就是最后一个。把这个正则放到separate的sep参数里就行:

# 在最后一个下划线处拆分变量名
df_split <- df_long %>%
  separate(combined_var, into = c("variable", "type"), sep = "_(?=[^_]+$)")

拆分完之后,再转回你需要的精简宽格式就很简单了:

# 按type重新展开成列
df_wide <- df_split %>%
  pivot_wider(names_from = type, values_from = value)

如果你的数据里存在没有下划线的列,怕拆分出错,可以加个extra = "merge"参数,这样没有下划线的列会完整保留在第一个变量里,第二个列自动填充NA:

# 兼容无下划线的列
df_split <- df_long %>%
  separate(combined_var, into = c("variable", "type"), sep = "_(?=[^_]+$)", extra = "merge")

这样一套流程下来,就能完美实现你想要的“拆分-重塑”操作啦~

内容的提问来源于stack exchange,提问作者Max M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:40:19