如何调整正则表达式,用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
相关产品推荐
相关产品推荐

