2013-05-10 43 views
2

在合併之前,有時需要更改列名的大小寫以保持一致性。使用data.frame時,這非常簡單(如here所述);雖然同樣的解決方案對``data.table`有效,它會引發警告。例如,什麼是最有效的方式來改變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 
+6

'setnames'是'data.table'包中的一個函數,並且警告指出這是做事的首選方式。 – James 2013-05-10 09:22:49

+1

那麼你是否要求更多的東西來解決你的解決方法,比如'setnames(DT,toupper(names(DT)))'? – 2013-05-10 11:36:08

+1

我不知道你是否編輯了你的問題......無論如何,正如前面的評論已經說過的那樣,'setnames'不是**解決方法,就像你說的那樣,但是'data.table'方法做到這一點。所以你可以把它作爲回答並接受它。 – 2013-05-10 16:41:47

回答

3

爲了給這個答案,因爲評論說,setnamesdata.table功能,已經是data.table推薦的方式(如從data.table很久警告提示);例如,

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

不要與setNames功能相混淆從stats包! (注意大寫N)。

相關問題