使用 R 中预先存在的名称系统地重命名列名

Systematically rename column names using pre-existing name in R

我有一个格式如下的数据框:

val1 = c(.35, .36, .35, .22, .27, .25)
val2 = c(.35, .35, .37, .40, .42, .46)
val3 = c(.88, .9, .87, .35, .35, .36)
val4 = c(.9, .91, .82, .36, .36, .36)
df = data.frame (val1, val2, val3, val4)
colnames(df)[1] = "group 1_31"
colnames(df)[2] = "group 1_32"
colnames(df)[3] = "group 2_32"
colnames(df)[4] = "group 10_310"

我知道这些列名称不太理想,但不幸的是它们是由我 运行 的程序自动提供的。我想重命名每一列,这样组 a_bc 变成 bca,像这样:

colnames(df)[1] = "311"
colnames(df)[2] = "321"
colnames(df)[3] = "322"
colnames(df)[4] = "31010"

我知道我可以通过以下方式摆脱 "group":

colnames(df)=sub("group ","",colnames(df))

但这仍然给我留下了“1_31”、“1_32”等

有没有办法在所有列名中自动将 a_bc 转换为 bca(我有 55 个需要此转换)?

我读过 但我认为我的情况有所不同,因为我需要对现有的列名重新排序,而不只是在特定位置将它们切断。

我们可以在捕获为一个组后重新排列反向引用

colnames(df) <- sub('group (\d+)_(\d+)', "\2\1", colnames(df))
colnames(df)
#[1] "311"   "321"   "322"   "31010"
val1 = c(.35, .36, .35, .22, .27, .25)
val2 = c(.35, .35, .37, .40, .42, .46)
val3 = c(.88, .9, .87, .35, .35, .36)
val4 = c(.9, .91, .82, .36, .36, .36)
df = data.frame (val1, val2, val3, val4)
colnames(df)[1] = "group 1_31"
colnames(df)[2] = "group 1_32"
colnames(df)[3] = "group 2_32"
colnames(df)[4] = "group 10_310"

gsub("^group (\d+)_(\d+)", "\2\1", colnames(df))
[1] "311"   "321"   "322"   "31010"