翻转弦的两侧

时间:2019-02-25 18:17:57

标签: r regex

我需要准备某些数据集进行分析。我所拥有的是带有列名的表(显然)。列名称如下(示例colnames):

"X99_NORM", "X101_NORM", "X76_110_T02_09747", "X30_NORM"

(这是向量,对于那些不熟悉R colnames()功能的人而言)

现在,我想要的只是在下划线之前和之后翻转值。例如X99_NORM成为NORM_X99。请注意,我只希望名称中包含NORM的列名。

3 个答案:

答案 0 :(得分:5)

x = c("X99_NORM", "X101_NORM", "X76_110_T02_09747", "X30_NORM")
replace(x,
        grepl("NORM", x),
        sapply(strsplit(x[grepl("NORM", x)], "_"), function(x){
            paste(rev(x), collapse = "_")
        }))
#[1] "NORM_X99"          "NORM_X101"         "X76_110_T02_09747" "NORM_X30"         

答案 1 :(得分:5)

其他一些基本R选项

1)

使用sub切换开始和结束-我们可以在此处使用捕获组。

x <- sub(pattern = "(^X\\d+)_(NORM$)", replacement = "\\2_\\1", x = x)

结果

x
# [1] "NORM_X99"          "NORM_X101"         "X76_110_T02_09747" "NORM_X30"

2)

一种无正则表达式的方法,使用chartrdirnamepaste可能会更有效。但是我们需要首先获取包含“ NORM”的列的索引

idx <- grep(x = x, pattern = "NORM", fixed = TRUE)
x[idx] <- paste0("NORM_", dirname(chartr("_", "/", x[idx])))
x

数据

x <- c("X99_NORM", "X101_NORM", "X76_110_T02_09747", "X30_NORM")

答案 2 :(得分:2)

具有tidyverse的{​​{1}}解决方案:

stringr