如何用tidyr::separate仅拆分R数据框中最后n个分隔实例?
这个问题很常见——当拆分的分隔符在目标列的不同位置出现,而我们只想保留最后几个拆分结果时,调整正则表达式就能完美解决!
你可以用tidyr::extract()代替separate(),通过正则捕获组精准匹配你想要的三个部分:前面包含下划线的内容作为varName,倒数第二个下划线后的无下划线内容作为treatment,最后一个下划线后的内容作为canopyPosition。
直接看代码:
library(dplyr) library(tidyr) tmp2 <- data.frame( varTreatName = c( "resp_Nadd_belowCanopy", "resp_NPadd_belowCanopy" , "resp_sd_Nadd_belowCanopy", "resp_sd_NPadd_belowCanopy" ) ) tmp2 %>% extract( varTreatName, into = c("varName", "treatment", "canopyPosition"), # 正则逻辑说明: # ^(.+) :匹配开头所有内容(包含下划线),作为varName # _([^_]+) :匹配倒数第二个下划线后的无下划线内容,作为treatment # _([^_]+)$ :匹配最后一个下划线后的结尾内容,作为canopyPosition regex = "^(.+)_([^_]+)_([^_]+)$", remove = TRUE # 移除原列,可选,默认值为TRUE )
执行后得到的结果完全符合你的预期:
varName treatment canopyPosition 1 resp Nadd belowCanopy 2 resp NPadd belowCanopy 3 resp_sd Nadd belowCanopy 4 resp_sd NPadd belowCanopy
如果坚持想用separate(),也可以通过正则指定拆分的位置——只匹配倒数第二个和最后一个下划线:
tmp2 %>% separate( varTreatName, into = c("varName", "treatment", "canopyPosition"), # 正则逻辑说明: # _(?=[^_]+_[^_]+$) :正向先行断言,仅匹配倒数第二个下划线(确保后面还有一组下划线内容) # _ :匹配最后一个下划线 sep = c("_(?=[^_]+_[^_]+$)", "_"), extra = "merge" )
内容的提问来源于stack exchange,提问作者Thomas Wutzler
相关产品推荐
相关产品推荐

