更改 data.table 中列名大小写的最有效方法是啥?
Posted
技术标签:
【中文标题】更改 data.table 中列名大小写的最有效方法是啥?【英文标题】:What is the most efficient way to change the case of column names in a data.table?更改 data.table 中列名大小写的最有效方法是什么? 【发布时间】:2013-05-10 09:01:24 【问题描述】:有时在合并之前更改列名的大小写以保持一致性很有用。使用data.frame
时,这非常简单(如here 所述);尽管相同的解决方案适用于“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
包中的一个函数,正如警告所述,这是首选的处理方式。
那么,除了将您的解决方法压缩为 setnames(DT,toupper(names(DT)))
之类的东西之外,您还要求什么?
我不知道您是否编辑了您的问题...无论如何,正如之前的 cmets 已经说过的,setnames
不是解决方法,正如您所说的那样,但data.table
的方式来做到这一点。因此,您可以将其作为答案发布并接受。
只是为了说明这一点,R 中的警告消息不是错误,除非您明确将其提升为 options()
中的错误 [通常用于调试目的],如有用的警告消息所述。如果您在调用toupper()
之后检查了str(DT)
,您会发现存在DT
- 它不会从toupper()
调用中引发错误。
@kpeyton。高兴听到。事实上setnames
应该(几乎)无限快,因为即使对于非常大的表,它也应该(几乎)花费恒定的 0.00 秒。 data.frame
方式复制整个表,只是为了更改名称。即使是单个副本也可能非常重要,甚至可能意味着您遇到可怕的“内存不足”错误。
【参考方案1】:
要给出这个答案,正如 cmets 所说,setnames
是一个 data.table
函数,并且已经是 data.table
推荐的方式(正如来自 data.table
的长警告所暗示的那样);例如,
setnames(DT,toupper(names(DT)))
不要与stats
包中的setNames
函数混淆! (注意大写N
)。
【讨论】:
以上是关于更改 data.table 中列名大小写的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
当列名包含空格和特殊字符时从 data.table 包中读取?