将后缀转换为列名称中的前缀

时间:2016-11-23 15:16:24

标签: r gsub

我想将列名的后缀移动到它的开头,以便它成为它的前缀。我有很多列都在更改名称(后缀除外),所以手动重命名不是一个选项。

示例:

set.seed(1)
dat <- data.frame(ID = 1:5, 
                  speed.x.alpha =     runif(5), 
                  power.x.alpha = rpois(5, 1),
                  force.x.alpha = rexp(5), 
                  speed.y.beta = runif(5), 
                  power.y.beta = rpois(5, 1),
                  force.y.beta = rexp(5))

在最后,数据框应具有以下列名:

ID,alpha.speed.x,alpha.power.x,alpha.force.x,beta.speed.x,beta.power.x,force.power.x。

我强烈假设我需要一个gsub / sub表达式,它允许我选择最后一个点之后的字符,然后我会粘贴到这些字符串,最后从最后删除。到目前为止,虽然没有成功......

2 个答案:

答案 0 :(得分:3)

有几个gsubpaste0可以解决问题:

gsub("y$", "x", gsub("(^.*)\\.(.*a$)", paste0("\\2", ".", "\\1"), names(dat)))
[1] "ID"            "alpha.speed.x" "alpha.power.x" "alpha.force.x" "beta.speed.x" 
[6] "beta.power.x"  "beta.force.x"

正则表达式中的()捕获与子表达式匹配的字符。 “\”。用于匹配文字“。”并且“$”将表达式锚定到字符串的末尾。第二个参数将捕获的子表达式粘贴在一起。这个结果被送到第二个gsub,如果找到一个,则用“x”替换结尾的“y”。

重命名变量,使用

names(dat) <- gsub("y$", "x", gsub("(^.*)\\.(.*a$)", paste0("\\2", ".", "\\1"), names(dat)))

答案 1 :(得分:2)

以下是sub的一个选项。我们从字符串的开头(.)匹配一个或多个不是[^.]+^)的字符,将其捕获为组((...) - 在括号内),后跟一个点(\\. - 请注意.是一个元字符,表示任何字符。因此,需要将其转义(\\)以将其作为文字字符读取或者将它放在方括号内),然后是另一组不是点(在第二个捕获组内)的字符,后跟另一个点,其余的字符直到字符串的结尾。在替换中,我们更改捕获组的反向引用顺序以获得预期的输出。

names(dat) <- sub("^([^.]+)\\.([^.]+)\\.(.*)", "\\3.\\1.\\2", names(dat))
names(dat)
#[1] "ID"            "alpha.speed.x" "alpha.power.x" "alpha.force.x" 
#[5] "beta.speed.y"  "beta.power.y"  "beta.force.y"