【发布时间】: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方式复制整个表,只是为了更改名称。即使是单个副本也可能非常重要,甚至可能意味着您遇到可怕的“内存不足”错误。
标签: r data.table bigdata