Как переименовать все столбцы между двумя наборами столбцов в фрейме данных с помощью R?

#r #dplyr

Вопрос:

Допустим, я заинтересован в переименовании столбцов в нескольких наборах данных. Столбцы, которые необходимо переименовать, различаются по имени и положению, поэтому их нельзя выбрать таким образом. Однако столбцы, предшествующие столбцам, которые я хочу переименовать, и столбцы сразу после них являются постоянными.

В качестве примера, скажем mpg , cyl столбцы и в mtcars всегда являются первыми двумя столбцами, и их имена никогда не меняются. vs:carb Столбцы похожи, но их положение меняется в зависимости от количества столбцов, добавленных до них (но после cyl ). Однако имена переменных hp:qsec изменяются, и когда-нибудь между ними будет добавлена новая переменная.

Допустим, я хочу добавить слово '_Value' в конец каждого из столбцов, расположенных после cyl и до vs . Как бы я это сделал, в идеале используя dplyr ?

Ответ №1:

Вы можете попробовать —

 library(dplyr)

mtcars %>%
  rename_with(~paste0(., '_Value'), -c(mpg:cyl, vs:carb)) %>%
  head

#                   mpg cyl disp_Value hp_Value drat_Value wt_Value qsec_Value vs am gear carb
#Mazda RX4         21.0   6        160      110       3.90    2.620      16.46  0  1    4    4
#Mazda RX4 Wag     21.0   6        160      110       3.90    2.875      17.02  0  1    4    4
#Datsun 710        22.8   4        108       93       3.85    2.320      18.61  1  1    4    1
#Hornet 4 Drive    21.4   6        258      110       3.08    3.215      19.44  1  0    3    1
#Hornet Sportabout 18.7   8        360      175       3.15    3.440      17.02  0  0    3    2
#Valiant           18.1   6        225      105       2.76    3.460      20.22  1  0    3    1
 

Если у вас есть другие столбцы в данных и вы можете переименовать столбцы специально между cyl ними, и vs вы можете это сделать —

 start <- match('cyl', names(mtcars))
end <- match('vs', names(mtcars))
cols <- (start   1):(end - 1)
names(mtcars)[cols] <- paste0(names(mtcars)[cols], '_Value')
 

Комментарии:

1. Это полезно, спасибо. Я ограничен более старой версией dplyr. Есть ли альтернатива rename_with , которую я могу использовать?

2. Да, вы можете использовать rename_at в более старой версии — mtcars %>% rename_at(vars(-c(mpg:cyl, vs:carb)), ~paste0(., '_Value'))