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

在R语言中按最后一个下划线拆分DataFrame列的问题

解决R中DataFrame列拆分后stat列为空的问题

我来帮你分析下问题所在,然后给出几种可行的解决方案:

原代码的错误原因

你用的分隔正则\\_[^\\_]*$其实是匹配从最后一个下划线到字符串结尾的全部内容,比如对于CHB_len_SCM_max,这个正则会匹配_max。而separate函数会把匹配到的分隔符完全去掉,拆分后只留下分隔符前面的部分给Measurement,后面没有剩余内容分给stat,所以stat列就变成空的了。

解决方案一:使用separate_wider_regex(最直观)

tidyr的separate_wider_regex可以直接定义要提取的模式,逻辑清晰且可控:

library(tidyverse)

df <- data.frame(
  id = c("1","2","3"),
  col = c("CHB_len_SCM_max","CHB_brf_SCM_min","CHB_PROC_S_SV_mean")
)

df1 <- df %>%
  separate_wider_regex(
    col,
    patterns = list(
      Measurement = ".+(?=_)",  # 匹配最后一个下划线前的所有内容
      "_" = "_",                # 匹配分隔用的下划线
      stat = ".+"               # 匹配最后一个下划线后的所有内容
    )
  ) %>%
  select(id, Measurement, stat)

print(df1)

解决方案二:用stringr函数手动提取

如果你更喜欢分步处理,可以用str_extract和str_remove来分别提取stat和Measurement:

df1 <- df %>%
  mutate(
    stat = str_extract(col, "[^_]+$"),  # 提取最后一个下划线后的内容
    Measurement = str_remove(col, paste0("_", stat))  # 移除最后一个下划线和stat部分
  ) %>%
  select(id, Measurement, stat)

解决方案三:调整separate的正则(使用正向先行断言)

如果坚持用separate,可以把分隔符定位到最后一个下划线的前面位置(而非包含下划线和后续内容),用正向先行断言实现,后续再移除stat列的下划线即可:

df1 <- df %>%
  separate(col, into = c("Measurement", "stat"),
           sep = "(?=_[^_]+$)",  # 匹配最后一个下划线前面的位置
           remove = TRUE) %>%
  mutate(stat = str_remove(stat, "_"))  # 移除stat列开头的下划线

最终输出

不管用哪种方法,都会得到你想要的结果:

id   Measurement stat
1  1   CHB_len_SCM  max
2  2   CHB_brf_SCM  min
3  3 CHB_PROC_S_SV mean

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:44