Apa cara paling efisien untuk mengubah kapitalisasi nama kolom di data.tabel?

Terkadang sebelum menggabungkan ada gunanya mengubah huruf besar/kecil nama kolom untuk konsistensi. Saat bekerja dengan data.frame, hal ini cukup mudah (seperti diuraikan di sini); meskipun solusi yang sama berfungsi pada ``data.table`, solusi ini memunculkan peringatan. Misalnya,

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.

Saya telah menggunakan solusi berikut untuk menghindari kesalahan, dan ini jauh lebih cepat pada kumpulan data yang luas, tetapi apakah ada data.table cara untuk melakukan ini?

##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 sumber
comment
setnames adalah fungsi dari paket data.table, dan seperti yang dinyatakan dalam peringatan, ini adalah cara yang lebih disukai dalam melakukan sesuatu.   -  person James    schedule 10.05.2013
comment
Jadi, apakah Anda meminta lebih dari sekadar memadatkan solusi Anda menjadi sesuatu seperti setnames(DT,toupper(names(DT))) ?   -  person Carl Witthoft    schedule 10.05.2013
comment
Saya tidak tahu apakah Anda mengedit pertanyaan Anda...lagi pula, seperti yang telah dikatakan dalam komentar sebelumnya, setnames bukan solusi, seperti yang Anda ungkapkan, tetapi data.table cara untuk melakukannya. Jadi Anda bisa mempostingnya sebagai jawaban dan menerimanya.   -  person Christoph_J    schedule 10.05.2013
comment
Untuk memperjelas hal ini, pesan peringatan di R BUKAN merupakan kesalahan kecuali Anda secara eksplisit mempromosikannya ke kesalahan di options() [biasanya untuk tujuan debugging], seperti yang dicatat dalam pesan peringatan yang bermanfaat. Seandainya Anda memeriksa str(DT) setelah panggilan toupper(), Anda akan menemukan bahwa DT ada - tidak akan ada kesalahan yang terjadi dari panggilan toupper().   -  person Dennis    schedule 11.05.2013
comment
terima kasih atas tanggapannya. Saya hanya ingin tahu apakah ada sintaks yang lebih tepat untuk meneruskan operasi ke data.table daripada yang saya lakukan, yang telah dijawab oleh @Matthew. Seperti yang disebutkan dalam posting saya, Anda dapat menggunakan sintaks yang sama seperti yang Anda lakukan pada data.frame dan meskipun memunculkan pesan peringatan, itu masih berfungsi. Saya kira 'kesalahan' adalah pilihan kata yang salah jadi mohon maaf atas kebingungan di sana. Tampaknya 'penyelesaian' saya sebenarnya adalah cara yang tepat untuk melakukannya, dan itulah yang ingin saya ketahui. Sebagai catatan meskipun cara data.frame berhasil, cara data.table jauh lebih cepat.   -  person kpeyton    schedule 12.05.2013
comment
@kpeyton. Senang mendengarnya. Faktanya setnames seharusnya (hampir) jauh lebih cepat, karena bahkan untuk tabel yang sangat besar dibutuhkan (hampir) konstan 0,00 detik. Cara data.frame menyalin seluruh tabel, hanya untuk mengubah nama. Bahkan satu salinan pun bisa sangat signifikan dan bahkan mungkin berarti Anda mendapatkan kesalahan 'kehabisan memori' yang ditakuti.   -  person Matt Dowle    schedule 12.05.2013


Jawaban (1)


Untuk memberikan jawaban ini, seperti yang dikatakan dalam komentar, setnames adalah fungsi data.table dan sudah menjadi data.table cara yang direkomendasikan (seperti yang disarankan oleh peringatan panjang dari data.table); misalnya.,

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

Jangan bingung dengan fungsi setNames dari paket stats! (Perhatikan huruf besar N).

person Matt Dowle    schedule 11.05.2013