Переименовать несколько столбцов данных, на которые ссылаются текущие имена - PullRequest
38 голосов
/ 14 февраля 2012

Я хочу переименовать некоторые случайные столбцы в большом фрейме данных и хочу использовать имена текущих столбцов, а не индексы.Индексы столбцов могут измениться, если я добавлю или уберу столбцы в данные, поэтому я полагаю, что использование существующих имен столбцов является более стабильным решением.Вот что у меня сейчас:

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

Можно ли упростить этот код, либо исходный вызов merge(), либо просто вторая строка?"MyName.1" на самом деле является результатом xts merge двух разных объектов xts.

Ответы [ 5 ]

143 голосов
/ 15 февраля 2012

Проблема с изменением имен столбцов data.frame заключается в том, что, почти невероятно, копируется весь data.frame. Даже когда он находится в .GlobalEnv и никакая другая переменная не указывает на него.

Пакет data.table имеет функцию setnames(), которая изменяет имена столбцов по ссылкам без копирования всего набора данных. data.table отличается тем, что не копирует при записи, что может быть очень важно для больших наборов данных. (Вы сказали, что ваш набор данных был большим.) Просто укажите old и new имена:

require(data.table)
setnames(DT,"MyName.1", "MyNewName")
# or more explicit:
setnames(DT, old = "MyName.1", new = "MyNewName")
?setnames
25 голосов
/ 15 февраля 2012

plyr имеет функцию переименования только для этой цели:

library(plyr)
mydf <- rename(mydf, c("MyName.1" = "MyNewName"))
25 голосов
/ 15 февраля 2012
names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" # 13 characters shorter. 

Хотя, возможно, вы захотите заменить вектор в конце концов. В этом случае используйте %in% вместо == и установите MyName.1 в качестве вектора равной длины для MyNewName

4 голосов
/ 15 февраля 2012
names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf))

Это будет лучше обобщать для стратегии смены нескольких имен, если вы подставите ствол в качестве шаблона для замены, используя gsub вместо sub.

1 голос
/ 27 сентября 2018

Вы можете использовать функцию str_replace пакета stringr :

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