更改 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

【问题讨论】:

setnamesdata.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 包中读取?

如何在data.table中使用某些列名的字符向量选择列?[重复]

使用 data.table 时如何从字符向量创建列名

python data.table分组动态列名

R data.table:如何使用包含列名的 R 变量?

R:使用具有数字位置的重复列名来子集data.table