我想将列名的后缀移动到它的开头,以便它成为它的前缀。我有很多列都在更改名称(后缀除外),所以手动重命名不是一个选项。
示例:
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表达式,它允许我选择最后一个点之后的字符,然后我会粘贴到这些字符串,最后从最后删除。到目前为止,虽然没有成功......
答案 0 :(得分:3)
有几个gsub
和paste0
可以解决问题:
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"