重命名由当前名称引用的多个数据框列

时间:2012-02-14 19:42:45

标签: r dataframe rename

我想重命名数据框的一些随机列,我想使用当前列名,而不是索引。如果我向数据添加或删除列,列索引可能会更改,因此我认为使用现有列名称是一种更稳定的解决方案。 这就是我现在所拥有的:

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

我可以简化此代码,原始merge()来电还是第二行? "MyName.1"实际上是两个不同xts对象的xts merge的结果。

5 个答案:

答案 0 :(得分:140)

更改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

答案 1 :(得分:25)

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

虽然,您可能希望最终替换矢量。在这种情况下,使用%in%代替==并将MyName.1设置为长度等于MyNewName的向量

答案 2 :(得分:25)

plyr具有重命名功能,仅用于此目的:

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

答案 3 :(得分:4)

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

如果您使用gsub而不是sub将词干作为要替换的模式,这将更好地概括为多名称更改策略。

答案 4 :(得分:1)

您可以使用stringr软件包的str_replace功能:

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