变换后缀为前缀的列名
问题描述:
我想列名的后缀移动到它的开始,使之成为其前缀。我有很多列更改名称(除了后缀),所以手动重命名不是一个选项。变换后缀为前缀的列名
实施例:
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 /子表达,让我最后一个点,我会再粘贴到colnames,并最终从末尾移除后选择的字符。到目前为止,都没有成功,但...
答
一对夫妇的gsub
S和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)))
答
这里是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"