dplyrの「名前変更」の代わり


118

私はplyrの名前変更機能が好きですrename。私は最近dplyrの使用を開始し、dplyrの関数を使用して変数の名前を変更する簡単な方法があるかどうか疑問に思っていました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 14

2
@s_a明確化を追加しました。レビュー後に表示されます。
ライアン、

4
問題がある場合は、パッケージを明示的に指定すると役立つ場合がありますdplyr::rename(iris, petal_length = Petal.Length)
Boern

2
2つの簡単な観察:上記のコマンドを有効iris <- dplyr::rename(iris, petal_length = Petal.Length)にするにはデータフレームに割り当てる必要があり、rename()はスペースを含む変数名を処理しないため、たとえばdplyr::rename(iris, petal_length = "petal length")エラーが発生します。
Anthony Simon Mielniczuk 2017年

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
FYI changesはエクスポートされます(またはエクスポートされる必要があります)
ハドリー2014

2
いいね。唯一のことは、これは、ユーザーの側での考え方の変化を意味することです。これは、plyrの名前変更関数が使用するの"old"="new"に対して、他のdplyr関数との一貫性を保つdplyr使用new=oldです。個人的には、私はそれを問題とは考えていません。データ処理の大幅なスピードアップを意味する場合は特に、新しいことにすぐに慣れるでしょう。
vergilcw 14

3
これは意図された機能なので、動詞の選択ですselect。すべての変数を選択し、ちなみにこの列の名前を変更するということはわかりません。
Romain Francois 14

1
おそらく混乱を避けるために、select実際の動作をコードが反映するように投稿を編集できますか?dplyrすべての変数を保持し、1つまたは2つの名前を変更する簡単な方法に投票します。:)今のところ、私はロードplyrして使用し続けますrename
vergilcw 14

2
@RomainFrancois @aaronwolen OPが望んでいることを実現できmtcars %>% select(matches(".*"),disp2=disp)ます。私はもっ​​と簡潔な解決法を望んでいますが、これは機能し、すべての列を保持します(ただし、それらの順序は保持されません)。 disp複製されません。
激しい14

27

実際にplyrrename関数をdplyrチェーンの一部として使用できます。私はdata.frame、a)最初の引数としてa を取り、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関数の一部として直接名前を変更できます(上記のRomain Francoisの投稿を参照)。dplyrチェーンの一部としてnon-dplyr関数を使用することに関する一般的な記述はまだ有効ですrenameが、興味深い例です。


5
この場合、plyrの後に dplyr をロードするのが最適です。そうすれば、利用可能な場合はより高速なdplyr関数が使用され、dplyr :: mutateではなくmutateを使用できます
Vincent

チェーンでnon-dplyr関数を使用できることについて、あなたは正しいようです。mtcars%。%rename(c( "mpg"、 "cyl")、c( "mympg"、 "mycyl"))は、renameが私の回答で定義されている関数である場合に機能します。
Vincent

おかげで、dplyrとplyrの読み込み順序を変更しました。
user2503795 2014

これはまともな回避策ですが、dplyrの主な利点の1つである、より大きなデータでのパフォーマンスに関する興味深い議論が生じます。提案をありがとう!
vergilcw 14

data.tableパッケージからのsetnamesのような参照による作業の名前変更
MySchizoBuddy

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

編集:Romainによるコメントは以下を生成します(changes関数には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)
Romain Francois

1
コメントRomainをありがとう。dplyrから変更がエクスポートされない理由はありますか?とても便利な機能のようです。
Vincent

1
ハドリーはそれを私たちの開発ツールと見なしていると思います。
ロマンフランソワ

1
間違いなくエクスポートする必要があります。私はちょうど忘れてしまったかもしれません
ハドリー14

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 :: renameを使用しようとすると、エラーが発生します。

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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.