Заміна на "перейменувати" в dplyr


118

Мені подобається функція перейменування plyr rename. Нещодавно я почав використовувати dplyr, і мені було цікаво, чи існує простий спосіб перейменувати змінні за допомогою функції з dplyr, що є таким же простим у використанні, як і для plyr rename?

Відповіді:


148

dplyr версія 0.3 додала нову rename()функцію, яка працює так само plyr::rename().

df <- rename(df, new_name = old_name)

7
Чи можете ви пояснити синтаксис? Це важливіше команди. Я використовую, rename(TheDataFrame,OldVarName=NewVarName)але отримую Error: Unknown variables: NewVarName.і не розумію, чому.
s_a

2
@s_a Я додав пояснення. Він повинен з’явитися після перегляду.
Райан

4
Якщо у вас є проблеми, можливо, вказівка ​​пакета явно допомагає dplyr::rename(iris, petal_length = Petal.Length).
Борн

2
Два швидких зауваження: вищевказана команда повинна бути призначена рамці даних для вступу в дію, iris <- dplyr::rename(iris, petal_length = Petal.Length)а перейменування () не обробляє імена змінних з пробілами, наприклад, dplyr::rename(iris, petal_length = "petal length")створює помилку.
Ентоні Саймон Мільницюк

2
Ви можете використовувати, setNames()якщо ви замінюєте назви стовпців оптом:df %>% mutate(foo = 1 +2) %>% setNames(c("blah", "blu", "bar"))
crazybilly

46

Наступна версія dplyr підтримуватиме вдосконалену версію select, яка також включає перейменування:

> mtcars2 <- select( mtcars, disp2 = disp )
> head( mtcars2 )
                  disp2
Mazda RX4         160
Mazda RX4 Wag     160
Datsun 710        108
Hornet 4 Drive    258
Hornet Sportabout 360
Valiant           225
> changes( mtcars, mtcars2 )
Changed variables:
      old         new
disp  0x105500400
disp2             0x105500400

Changed attributes:
      old         new
names 0x106d2cf50 0x106d28a98

2
БЮР changesекспортується (або має бути)
Хадлі

2
Приємно. Єдине, що це буде означати зрушення в мисленні з боку користувача, оскільки plyrфункція перейменування використовує, "old"="new"тоді як dplyrвикористання, new=oldяке робить його узгодженим з рештою функцій dplyr. Особисто я не вважаю це проблемою - ви швидко звикаєте до нових речей, особливо коли це означає значне прискорення вашої обробки даних.
vergilcw

3
Це призначена ознака, звідси і вибір дієслова select. Не впевнені, що у нас є щось, що говорить, виберіть усі змінні і, до речі, перейменуйте цей стовпець.
Ромен Франсуа

1
Можливо, щоб уникнути плутанини, ви могли б відредагувати свою публікацію так, щоб код відображав selectповедінку насправді? Я б хотів проголосувати за простий dplyrспосіб зберегти всі змінні та просто перейменувати одну-дві. :) Зараз я продовжую завантажувати plyrта використовувати rename.
vergilcw

2
@RomainFrancois @aaronwolen Ви можете досягти того, що хоче використовувати ОП mtcars %>% select(matches(".*"),disp2=disp). Я б хотів більш парсимонічне рішення, але це працює і зберігає всі стовпці (хоча не їх порядок). dispне дублюється.
farnsy

27

Ви можете використовувати plyr«s renameфункцію як частина dplyrланцюгів. Я думаю, що кожна функція, яка a) приймає a data.frameяк перший аргумент, і b) повертає data.frameтвір для ланцюжка. Ось приклад:

library('plyr')
library('dplyr')

DF = data.frame(var=1:5)

DF %>%
    # `rename` from `plyr`
    rename(c('var'='x')) %>%
    # `mutate` from `dplyr` (note order in which libraries are loaded)
    mutate(x.sq=x^2)

#   x x.sq
# 1 1    1
# 2 2    4
# 3 3    9
# 4 4   16
# 5 5   25

ОНОВЛЕННЯ: Поточна версія dplyrпідтримує перейменування безпосередньо як частина selectфункції (див. Пост Ромена Франсуа вище). Загальне твердження про використання функцій, що не відносяться до депліру, як частини dplyrланцюгів, як і раніше, є дійсним і renameє цікавим прикладом.


5
Найкраще в цьому випадку завантажувати dplyr після plyr. Таким чином використовуються швидші функції dplyr, коли вони доступні, і ви можете використовувати мутацію, а не dplyr :: mutate
Vincent

Здається, ви маєте рацію щодо того, що ви можете використовувати функції не-dplyr в ланцюгу. mtcars%.% rename (c ("mpg", "cyl"), c ("mympg", "mycyl")) працює, коли перейменувати - це функція, визначена у моїй відповіді.
Вінсент

Я змінив порядок завантаження dplyr та plyr, спасибі.
user2503795

Це гідний спосіб вирішення, хоча викликає цікаву дискусію щодо продуктивності більшої кількості даних, що є однією з головних переваг dplyr. Дякую за пропозицію!
vergilcw

чи перейменовує роботу за посиланням, як назви з пакету
data.table

9

Він не вказаний як функція в dplyr (поки): http://cran.rstudio.org/web/packages/dplyr/dplyr.pdf

Функція нижче працює (майже) однаково, якщо ви не хочете завантажувати і plyr, і dplyr

rename <- function(dat, oldnames, newnames) {
  datnames <- colnames(dat)
  datnames[which(datnames %in% oldnames)] <- newnames
  colnames(dat) <- datnames
  dat
}

dat <- rename(mtcars,c("mpg","cyl"), c("mympg","mycyl"))
head(dat)

                  mympg mycyl disp  hp drat    wt  qsec 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

Редагувати: коментар Ромена створює наступне (зауважте, що для зміни функції потрібен dplyr .1.1)

> dplyr:::changes(mtcars, dat)
Changed variables:
          old         new        
disp      0x108b4b0e0 0x108b4e370
hp        0x108b4b210 0x108b4e4a0
drat      0x108b4b340 0x108b4e5d0
wt        0x108b4b470 0x108b4e700
qsec      0x108b4b5a0 0x108b4e830
vs        0x108b4b6d0 0x108b4e960
am        0x108b4b800 0x108b4ea90
gear      0x108b4b930 0x108b4ebc0
carb      0x108b4ba60 0x108b4ecf0
mpg       0x1033ee7c0            
cyl       0x10331d3d0            
mympg                 0x108b4e110
mycyl                 0x108b4e240

Changed attributes:
          old         new        
names     0x10c100558 0x10c2ea3f0
row.names 0x108b4bb90 0x108b4ee20
class     0x103bd8988 0x103bd8f58

3
Єдине питання тут полягає в тому, що дані копіюються. Не важливо, якщо це для гри, тобто mtcarsтощо ..., але досить драматично, якщо ви маєте справу зі значними даними. перевіркаdplyr:::changes(mtcars, dat)
Ромен Франсуа

1
Дякую за коментар Ромен. Чи є причина, що зміни не експортуються з dplyr? Здається, цілком корисна функція.
Вінсент

1
Я думаю, що Хадлі в основному сприймає це як інструмент розвитку для нас.
Ромен Франсуа

1
Це, безумовно, слід експортувати. Я, можливо, просто забув
hadley

2

Хоча це точно не перейменовується, dplyr::select_all()його можна використовувати для переформатування назв стовпців. Цей приклад замінює пробіли та періоди підкресленням і перетворює все в малі регістри:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

1

Я спробував використовувати dplyr :: перейменувати, і я отримав помилку:

occ_5d <- dplyr::rename(occ_5d, rowname='code_5d')
Error: Unknown column `code_5d` 
Call `rlang::last_error()` to see a backtrace

Я замість цього використовував базову функцію R, яка виявляється досить простою та ефективною:

names(occ_5d)[1] = "code_5d"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.