Переименование переименованных столбцов
Я хочу переименовать некоторые случайные столбцы в большом кадре данных, и я хочу использовать текущие имена столбцов, а не индексы. Индексы столбцов могут измениться, если я добавлю или удалю столбцы для данных, поэтому я считаю, что использование существующих имен столбцов является более стабильным решением.
Это то, что у меня есть сейчас:
mydf = merge(df.1, df.2)
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName"
Могу ли я упростить этот код, будь то оригинальный вызов merge()
или только вторая строка? "MyName.1"
является фактически результатом xts merge
двух разных объектов xts.
Ответы
Ответ 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
.