Dplyr'de "yeniden adlandır" için değiştirme


118

Plyr'in yeniden adlandırma işlevini seviyorum rename. Son zamanlarda dplyr kullanmaya başladım ve dplyr'den bir işlevi kullanarak değişkenleri yeniden adlandırmanın kolay bir yolu olup olmadığını merak ediyordum, kullanımı plyr'ler kadar kolay renamemı?

Yanıtlar:


148

dplyr sürüm 0.3 rename(), aynı şekilde çalışan yeni bir işlev ekledi plyr::rename().

df <- rename(df, new_name = old_name)

7
Sözdizimini açıklayabilir misiniz? Bu komuttan daha önemli. Kullanıyorum rename(TheDataFrame,OldVarName=NewVarName)ama Error: Unknown variables: NewVarName.anlıyorum ve nedenini anlamıyorum.
s_a

2
@s_a Açıklamayı ekledim. İncelemeden sonra görünmesi gerekir.
Ryan

4
Sorun yaşıyorsanız, paketi açıkça belirtmeniz yardımcı olabilir dplyr::rename(iris, petal_length = Petal.Length).
Boern

2
İki hızlı gözlem: Yukarıdaki komutun etkili olması için veri çerçevesine atanması gerekir iris <- dplyr::rename(iris, petal_length = Petal.Length)ve rename () boşluklu değişken adlarını işlemez, örneğin dplyr::rename(iris, petal_length = "petal length")bir hata üretir.
Anthony Simon Mielniczuk

2
setNames()Sütun adlarını toptan değiştiriyorsanız kullanabilirsiniz :df %>% mutate(foo = 1 +2) %>% setNames(c("blah", "blu", "bar"))
crazybilly

46

Bir sonraki dplyr sürümü, yeniden adlandırmayı da içeren gelişmiş bir seçme sürümünü destekleyecektir:

> 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
FYI changesihraç edildi (veya olmalı)
hadley

2
Güzel. Tek şey bu yana, kullanıcıyı kullanıcının düşüncelerinde değişiklik anlamına geleceğinden olduğu plyr'ın yeniden adlandırma işlevi kullanımlar "old"="new"oysa dplyrkullanımlar new=olddplyr fonksiyonlarının geri kalanı ile tutarlı olmasını sağlamaktır gelmez. Kişisel olarak, bunu bir sorun olarak görmüyorum - özellikle veri işlemenizde önemli bir hızlanma anlamına geldiğinde yeni şeylere hızla alışırsınız.
vergilcw

3
Bu amaçlanan özellik, dolayısıyla fiil seçimidir select. Tüm değişkenleri seç ve bu sütunu yeniden adlandır diyen bir şeyimiz olduğundan emin değiliz.
Romain Francois

1
Belki karışıklığı önlemek için gönderinizi, kodun selectgerçekte nasıl davrandığını yansıtacak şekilde düzenleyebilir misiniz ? dplyrTüm değişkenleri tutmanın ve bir veya ikisini yeniden adlandırmanın kolay bir yolu için oy kullanırdım . :) Şimdilik yüklemeye plyrve kullanmaya devam edeceğim rename.
vergilcw

2
@RomainFrancois @aaronwolen OP'nin kullanarak istediğini elde edebilirsiniz mtcars %>% select(matches(".*"),disp2=disp). Daha cimri bir çözüm isterdim ama bu işe yarıyor ve tüm sütunları koruyor (sıralarını değil). dispkopyalanmaz.
farnsy

27

Aslında zincirlerin bir parçası olarak plyr'ın renameişlevini kullanabilirsiniz dplyr. Sanırım a) data.frameilk argüman olarak a'yı alan ve b) data.framezincirleme için bir çalışma döndüren her fonksiyon . İşte bir örnek:

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

GÜNCELLEME: Mevcut sürüm dplyr, selectişlevin bir parçası olarak doğrudan yeniden adlandırmayı destekler (yukarıdaki Romain Francois gönderisine bakın). dplyrZincirlerin bir parçası olarak dplyr dışı işlevleri kullanma hakkındaki genel ifade yine de geçerlidir ve renameilginç bir örnektir.


5
Bu durumda dplyr'i plyr'den sonra yüklemek en iyisidir . Bu şekilde, mevcut olduğunda daha hızlı dplyr işlevleri kullanılır ve dplyr :: mutate yerine mutate kullanabilirsiniz
Vincent

Zincirlemede dplyr dışı işlevleri kullanma konusunda haklısınız gibi görünüyor. mtcars%.% rename (c ("mpg", "cyl"), c ("mympg", "mycyl")) yeniden adlandırma benim cevabımda tanımlanan fonksiyon olduğunda çalışır.
Vincent

Dplyr ve plyr yükleme sırasını değiştirdim, teşekkürler.
user2503795

Bu iyi bir çözüm olsa da, dplyr'in ana avantajlarından biri olan daha büyük verilerdeki performans hakkında ilginç bir tartışma getiriyor. Önerin için teşekkürler!
vergilcw

data.table paketindeki setnames gibi işi referansa göre yeniden adlandırır
MySchizoBuddy

9

Dplyr'de bir işlev olarak listelenmemiştir (henüz): http://cran.rstudio.org/web/packages/dplyr/dplyr.pdf

Hem plyr hem de dplyr yüklemek istemiyorsanız aşağıdaki işlev (neredeyse) aynı şekilde çalışır.

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

Düzenleme: Romain'in yorumu aşağıdakileri üretir (değişiklik işlevinin dplyr .1.1 gerektirdiğini unutmayın)

> 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
Buradaki tek sorun, verilerin kopyalanmasıdır. Bu oynamak içinse mtcarsönemli değil , yani vs ... ama önemli verilerle uğraşırsanız oldukça dramatik. checkdplyr:::changes(mtcars, dat)
Romain Francois

1
Yorumunuz için teşekkürler Romain. Değişikliklerin dplyr'den dışa aktarılmamasının bir nedeni var mı? Oldukça kullanışlı bir işlev gibi görünüyor.
Vincent

1
Sanırım hadley bunu bizim için çoğunlukla bir geliştirme aracı olarak görüyor.
Romain Francois

1
Kesinlikle ihraç edilmelidir. Sadece unutmuş olabilirim
hadley

2

Tam olarak yeniden adlandırmasa da, dplyr::select_all()sütun adlarını yeniden biçimlendirmek için kullanılabilir. Bu örnek, boşlukları ve noktaları bir alt çizgiyle değiştirir ve her şeyi küçük harfe dönüştürür:

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 :: rename kullanmayı denedim ve bir hata alıyorum:

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

Bunun yerine, oldukça basit ve etkili olduğu ortaya çıkan temel R işlevini kullandım:

names(occ_5d)[1] = "code_5d"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.