web-dev-qa-db-ja.com

現在の名前で参照される複数のデータフレーム列の名前を変更します

largeデータフレームのランダムな列の名前を変更し、インデックスではなく現在の列名を使用します。データに列を追加または削除すると列インデックスが変更される可能性があるため、既存の列名を使用する方がより安定したソリューションであると考えています。これは私が今持っているものです:

_mydf = merge(df.1, df.2)
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName"
_

元のmerge()呼び出しまたは2行目だけで、このコードを単純化できますか? _"MyName.1"_は、実際には2つの異なるxtsオブジェクトのxts mergeの結果です。

38
Robert Kubrick
names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" # 13 characters shorter. 

ただし、最終的にベクトルを置き換えることができます。その場合は、%in% の代わりに ==およびMyName.1をMyNewNameと等しい長さのベクトルとして設定します

25

_data.frame_の列名を変更する際の問題は、ほとんど信じられないほど、_data.frame_全体がコピーされることです。 _.GlobalEnv_にあり、他の変数がそれを指していない場合でも。

_data.table_ package には、データセット全体をコピーせずに参照によって列名を変更するsetnames()関数があります。 _data.table_は、コピーオンライトを行わないという点で異なります。これは、大規模なデータセットにとって非常に重要です。 (データセットが大きいと言いました。)単にoldnewの名前を指定してください:

_require(data.table)
setnames(DT,"MyName.1", "MyNewName")
# or more explicit:
setnames(DT, old = "MyName.1", new = "MyNewName")
?setnames
_
145
Matt Dowle

plyrには、この目的のための名前変更機能があります。

library(plyr)
mydf <- rename(mydf, c("MyName.1" = "MyNewName"))
25
hadley
names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf))

これは、gsubの代わりにsubを使用して置換されるパターンとしてステムを配置する場合、複数の名前の変更戦略に一般化されます。

4
42-

stringr パッケージのstr_replace関数を使用できます。

names(mydf) <- str_replace(names(mydf), "MyName.1", "MyNewName")
1
tfad334