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
setnames
adalah fungsi dari paketdata.table
, dan seperti yang dinyatakan dalam peringatan, ini adalah cara yang lebih disukai dalam melakukan sesuatu. - person James   schedule 10.05.2013setnames(DT,toupper(names(DT)))
? - person Carl Witthoft   schedule 10.05.2013setnames
bukan solusi, seperti yang Anda ungkapkan, tetapidata.table
cara untuk melakukannya. Jadi Anda bisa mempostingnya sebagai jawaban dan menerimanya. - person Christoph_J   schedule 10.05.2013options()
[biasanya untuk tujuan debugging], seperti yang dicatat dalam pesan peringatan yang bermanfaat. Seandainya Anda memeriksastr(DT)
setelah panggilantoupper()
, Anda akan menemukan bahwaDT
ada - tidak akan ada kesalahan yang terjadi dari panggilantoupper()
. - person Dennis   schedule 11.05.2013data.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 padadata.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 caradata.frame
berhasil, caradata.table
jauh lebih cepat. - person kpeyton   schedule 12.05.2013setnames
seharusnya (hampir) jauh lebih cepat, karena bahkan untuk tabel yang sangat besar dibutuhkan (hampir) konstan 0,00 detik. Caradata.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