データフレームの列名の変更


399

「newprice」(以下を参照)というデータフレームがあり、Rのプログラムで列名を変更したい。

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

実際、これは何をしているのですか?

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

ご覧のとおり、各列の名前を変えたいので、これをループに入れていません。

プログラムをRコンソールに貼り付けると、次のような出力が得られます。

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

c()関数のc("premium")代わりに関数を使用することも同様に試しましpaste()たが、役に立ちませんでした。

誰かがこれを理解するのを手伝ってくれませんか?


ダークの答えが機能する場合、問題は、データフレームではなくマトリックスを使用していたことでした。is.matrixまたはで確認できますstr
IRTFM

3
dplyr ::名前の変更でこの答えを参照してくださいstackoverflow.com/a/26146202/1831980
ラスマス・ラーセン

8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyen

エラーはコードの品質とは関係ありません。間違った記号を使用しています。これは、「Rで認識されません。代わりに "を使用してください。同じように見える可能性があります。よく見てください:" "。それでおしまい。
江戸

回答:


594

colnames()関数を使用します。

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

サブセット化することもできます:

R> colnames(X)[2] <- "superduper"

12
@Dirk colnames()の代わりにnames()を使用しないのはなぜですか?
AntoineLizée2013年

4
すごい!複数の列を一度にサブセット化することもできます(ビッグデータフレームで役立ちます)。colnames(X)[c(1,2)] <- c("good", "better")
metakermit 2013年

7
試しsetnames()data.tableパッケージ。使用のようなものsetnames(DT,"b","B")setnames(DT,c("a","E"),c("A","F"))
dwstu

奇妙なことに、データフレームの列名を設定した後、asをq1使用dplyrしてデータフレームを変更しようとするq1 <- q1 %>% mutate(rel_count = count / 482462)と、エラーが発生しますError in mutate_impl(.data, dots) : unknown column 'days'days列に新しい名前が付けられています)。これは本当にイライラさせられます。
David Tonhofer 2017

176

私はこれを使います:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"

7
ありがとうございました。これはR
Arne

10
この方法には、元の名前がわかっていれば、列の位置を気にする必要がないという利点があります。名前を変更する列の位置を変更するコードを後で変更する場合があるので、これが推奨される方法だと思います。
Paulo S. Abreu

78

エラーは「スマートクォート」(またはそれらが呼び出されたもの)が原因です。ここでの教訓は、「引用符をスマート引用符に変換する「エディタ」でコードを記述しないでください」です。

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

また、必要ないのでpaste("premium")(呼び出しpasteは冗長です)、<-混乱を避けるためにスペースを置くことをお勧めします(例:)x <- -10; if(x<-3) "hi" else "bye"; x



42

これを行うための新しい推奨方法は、setNames関数を使用することです。を参照してください ?setNames。これによりの新しいコピーが作成されるため、意図した場合data.frameは、結果を元のに割り当ててdata.frameください。

data_frame <- setNames(data_frame, c("premium","change","newprice"))

Rの新しいバージョンでcolnamesは、以前の回答で提案されたいくつかの方法で使用すると警告が表示されます。

これがdata.table代わりの場合は、data.table関数を使用して、setnames特定の列名または単一の列名を参照で変更できます

setnames(data_table, "old-name", "new-name")

2
data.tableではなくdata.frameが要求されたと思う
Helix123 '16

35

私も同じ問題を抱えていて、このコードの一部がうまくいきました。

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

つまり、このコードは次のことを行います。

names(data)データフレーム内のすべての名前を調べます(data

[names(data) == oldVariableName]名前を変更する変数名(oldVariableName)を抽出し<- "newVariableName"、新しい変数名を割り当てます。


たとえば3つのoldVariableNamesを持つベクターがある場合、これはどのように機能しますか?
jiggunjer 2018

まさに私が探していたもの->いいね!
SilSur



10

古い列名しかわからないときに、一度にすべてではなく複数の列の名前を変更する必要がある場合は、colnames関数と%in%演算子を使用できます。例:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

ここで、「不良」と「最悪」を「良好」と「最良」に変更したいとします。使用できます

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

これは

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C

1
このコードは、列名の順序が挿入の順序と同じであることを前提としています
Hillary Sanders

10

これを使用して、colname関数で列名を変更します。

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

8

次の方法で編集できます。

newprice <- edit(newprice)

列名を手動で変更します。


これはベクトル要素と因子要素に対してのみ機能しませんか?> locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
vagabond 14

少なくともデータフレームに対しては機能します。それは私が知っていることです。
バイカル2014

7

私の列名は以下の通りです

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

クラスとセックスの列名を変更したい

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")

7

dplyr::rename()およびにはいくつかのオプションがありますdplyr::select()

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

スコープが3つあるバリアントもありますdplyr::rename()dplyr::rename_all()すべての列名、dplyr::rename_if()条件付きで列名をターゲットにするため、および名前dplyr::rename_at()付き列を選択するためです。次の例では、スペースとピリオドをアンダースコアに置き換え、すべてを小文字に変換します。

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_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

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

6

スコットウィルソンの回答を修正して少し拡張します。
data.tablesのsetnames関数をdata.framesでも使用できます。

操作の高速化を期待しないでください。ただしsetnames、参照によって列名を更新するため、メモリの消費がより効率的になることが期待できます。これはaddress関数で追跡できます。以下を参照してください。

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

したがって、メモリ制限に達している場合は、代わりにこれを使用することを検討してください。


3

これは役立つかもしれません:

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

1

2つのデータフレームがある場合、次の作品

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

DF1の名称を以下のように変更

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