我需要准备某些数据集进行分析。我所拥有的是带有列名的表(显然)。列名称如下(示例colnames
):
"X99_NORM", "X101_NORM", "X76_110_T02_09747", "X30_NORM"
(这是向量,对于那些不熟悉R colnames()
功能的人而言)
现在,我想要的只是在下划线之前和之后翻转值。例如X99_NORM
成为NORM_X99
。请注意,我只希望名称中包含NORM
的列名。
答案 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)
一种无正则表达式的方法,使用chartr
,dirname
和paste
可能会更有效。但是我们需要首先获取包含“ 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