我想重命名大数据框的一些随机列,我想使用当前列名,而不是索引。如果我向数据添加或删除列,列索引可能会更改,因此我认为使用现有列名称是一种更稳定的解决方案。 这就是我现在所拥有的:
mydf = merge(df.1, df.2)
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName"
我可以简化此代码,原始merge()
来电还是第二行? "MyName.1"
实际上是两个不同xts对象的xts merge
的结果。
答案 0 :(得分:140)
更改data.frame
列名称的问题在于,几乎令人难以置信的是,整个data.frame
被复制了。即使它在.GlobalEnv
中,也没有其他变量指向它。
data.table
package有一个setnames()
函数,可以通过引用更改列名而不复制整个数据集。 data.table
的不同之处在于它不会写入时复制,这对于大型数据集非常重要。 (你的确说你的数据集很大。)只需提供old
和new
名称:
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")