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

Transform suffix into prefix in column name

我想将列名的后缀移到其开头,使其成为其前缀。我有许多名称更改的列(后缀除外),因此无法手动重命名。

示例:

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 表达式,它允许我 select 最后一个点之后的字符,然后我将其粘贴到 colnames,并最终从末尾删除。到目前为止还没有成功...

几个 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",它会用 "x" 替换结尾 "y"。

要重命名变量,请使用

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

这是 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"