2012-02-14 560 views
29

我想重命名大的數據框的一些隨機列,我想使用當前列名稱,而不是索引。如果向數據添加或刪除列,那麼列索引可能會更改,所以我使用現有的列名稱是更穩定的解決方案。 這是我現在有:命名的列重命名

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

我可以簡化這個代碼,要麼是原始merge()來電或第二線? "MyName.1"實際上是兩個不同xts對象的xts merge的結果。

+0

你能提供一個小的可再生的數據與所需的輸出設定? – Dason 2012-02-14 19:46:07

+0

你不需要那裏的'哪個! R在運算符[]中接受布爾值。 'colnames(mydf)[colnames(mydf)==「MyName.1」] =「MyNewName」'應該工作! – 2012-02-14 19:48:25

+1

'names(mydf)[names(mydf)==「MyName.1」] =「MyNewName」'...約13個左右的字符縮短。雖然,在這種情況下你可能想要替換一個向量,但使用%而不是==。 – 2012-02-14 19:58:58

回答

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

雖然,你可能想要最終替換一個向量。在這種情況下,使用%in%代替==,並設置MyName.1爲等長的矢量MyNewName

4
names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf)) 

如果你把一個幹作爲一個模式,應該推廣更好的多名稱變更策略使用gsub而不是sub替換。

+0

謝謝,這使我在正確的道路上。我現在在做:names(df)[grep(「。1」,names(df))] = c(「AName.Col1」,「AName.Col2」,「AName.Col3」) – 2012-02-15 21:04:42

115

更改data.frame的列名的麻煩是,幾乎難以置信地複製了整個data.frame。即使它在.GlobalEnv中,也沒有其他變量指向它。

data.table package有一個setnames()函數,它通過引用更改列名而不復制整個數據集。 data.table不同之處在於它沒有寫入時複製,這對於大型數據集可能非常重要。 (你說過你的數據集很大。)

require(data.table) 
setnames(DT,"MyName.1","MyNewName") 
?setnames 
+4

Heh。這對於處理'data.frame'幾乎任何東西都是個問題。你會認爲只是改變因素水平也會很快,但事實並非如此。 (我相信你們所有的人都知道。) – 2012-02-15 16:49:20

+0

@DWin。你好。我認爲'data.table'中的'setattrib()'可以通過引用改變列的級別(在data.frame中也是如此)。顯然需要小心處理。可能有一個新的'setlevels()'函數會改變一個或多個級別(與setnames()')具有相同的接口)?順便說一句,':='已經通過引用增加了新的因子水平,這在基礎上是非常棘手的。那裏有相當多的C代碼。 – 2012-02-15 17:33:20

23

plyr有一個重命名功能只是這個目的:

library(plyr) 
mydf <- rename(mydf, c("MyName.1" = "MyNewName")) 
+3

此函數現在也包含在'dplyr'包中。 – 2015-04-29 20:12:38