Подтвердить что ты не робот

Переименование переименованных столбцов

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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