2012-02-14 320 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