在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
相关产品推荐
相关产品推荐

