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