Каков наиболее эффективный способ изменить регистр имен столбцов в таблице данных?

Иногда перед слиянием полезно изменить регистр имен столбцов для согласованности. При работе с data.frame это довольно просто (как описано здесь); хотя то же самое решение работает с ``data.table`, оно выдает предупреждение. Например,

ran <- rep(34,50)
dom <- rep("cat",50)
table <- rep("pig", 50)

DT <- data.table(ran,dom,table); head(DT)
   ran dom table
1:  34 cat   pig
2:  34 cat   pig
3:  34 cat   pig
4:  34 cat   pig
5:  34 cat   pig
6:  34 cat   pig

##the data.frame way

names(DT) <- toupper(names(DT))

##the error 
Warning message:
In `names<-.data.table`(`*tmp*`, value = c("RAN", "DOM", "TABLE" :
  The names(x)<-value syntax copies the whole table. This is due to <- in R 
 itself. Please change to setnames(x,old,new) which does not copy and is faster. 
 See help('setnames'). You can safely ignore this warning if it is inconvenient 
 to change right now. Setting options(warn=2) turns this warning into an error, 
 so you can then use traceback() to find and change your names<- calls.

Я использовал следующий обходной путь, чтобы избежать ошибки, и он намного быстрее работает с широкими наборами данных, но есть ли data.table способ сделать это?

##the work around
upper <- toupper(names(DT))

setnames(DT,upper);head(DT)

   RAN DOM TABLE
1:  34 cat   pig
2:  34 cat   pig
3:  34 cat   pig
4:  34 cat   pig
5:  34 cat   pig
6:  34 cat   pig

person kpeyton    schedule 10.05.2013    source источник
comment
setnames — это функция из пакета data.table, и, как указано в предупреждении, это предпочтительный способ работы.   -  person James    schedule 10.05.2013
comment
Итак, вы просите чего-то большего, чем сжатие вашего обходного пути до чего-то вроде setnames(DT,toupper(names(DT))) ?   -  person Carl Witthoft    schedule 10.05.2013
comment
Я не знаю, редактировали ли вы свой вопрос... в любом случае, как уже говорилось в предыдущих комментариях, setnames - это не обходной путь, как вы это формулируете, а data.table способ сделать это. Так что вы можете просто опубликовать это как ответ и принять его.   -  person Christoph_J    schedule 10.05.2013
comment
Просто чтобы было ясно, предупреждающее сообщение в R НЕ является ошибкой, если вы явно не продвигаете его к ошибке в options() [обычно в целях отладки], как отмечено в полезном предупреждающем сообщении. Если бы вы проверили str(DT) после вашего вызова toupper(), вы бы обнаружили, что DT существует - ошибка не возникла бы из вызова toupper().   -  person Dennis    schedule 11.05.2013
comment
спасибо за ответы. Я просто хотел знать, есть ли более подходящий синтаксис для передачи операции data.table, чем то, что я сделал, на что @Matthew ответил. Как упоминалось в моем посте, вы можете использовать тот же синтаксис, что и для data.frame, и хотя он выдает предупреждающее сообщение, он все еще работает. Я предполагаю, что «ошибка» была неправильным выбором слова, так что извините за путаницу. Кажется, моя «обходная работа» была на самом деле подходящим способом сделать это, и это то, что я хотел знать. Для справки, хотя способ data.frame работает, способ data.table намного быстрее.   -  person kpeyton    schedule 12.05.2013
comment
@кпейтон. Рад слышать. На самом деле setnames должен быть (почти) бесконечно быстрее, поскольку даже для очень больших таблиц он должен занимать (почти) постоянные 0,00 секунды. Способ data.frame копирует всю таблицу, только чтобы изменить имена. Даже одна копия может иметь большое значение и может даже означать, что вы получите ужасную ошибку «недостаточно памяти».   -  person Matt Dowle    schedule 12.05.2013


Ответы (1)


Чтобы ответить на этот вопрос, как говорится в комментариях, setnames является функцией data.table и уже является рекомендуемым способом data.table (как предполагает это длинное предупреждение от data.table); например.,

setnames(DT,toupper(names(DT)))

Не путать с функцией setNames из пакета stats! (Обратите внимание на верхний регистр N).

person Matt Dowle    schedule 11.05.2013