Систематически переименовывать имена столбцов, используя уже существующее имя в 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"

Я знаю, что могу избавиться от «группы», выполнив:

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

но это все равно оставляет мне «1_31», «1_32» и т. д.

Есть ли способ автоматически преобразовать a_bc в bca по всем именам столбцов (у меня 55, которые нуждаются в этом преобразовании)?

Я прочитал Переименовать фрейм данных Имена столбцов в R с использованием предыдущего имени столбца и шаблона регулярного выражения, но я думаю, что мой случай отличается, потому что мне нужно изменить порядок имени существующего столбца, а не просто отрезать их в определенной позиции.


person TAH    schedule 12.02.2020    source источник


Ответы (1)


Мы можем переставить обратные ссылки после захвата как группы

colnames(df) <- sub('group (\\d+)_(\\d+)', "\\2\\1", colnames(df))
colnames(df)
#[1] "311"   "321"   "322"   "31010"
person akrun    schedule 12.02.2020
comment
Не могли бы вы вкратце объяснить, что это делает? Мне кажется: вы определяете группу с первым элементом (\\ d +) и вторым элементом после _ (\\ d). Затем при замене подфункции вы в основном говорите о переключении позиций. Что, если я поставлю имена столбцов (df3) = sub ('group (\\ d +) _ (\\ d +)', \\ 3 \\ 1, colnames (df3))? Я получаю c (1,1,2,10). Почему? Спасибо - person Carlo; 12.02.2020
comment
@Carlo совпадение с шаблоном. Ed находится после group и пробела (`_2 _ (\\ d +) _ 3 ___ 4 _ \\ 2 \\ 1`) - person akrun; 12.02.2020