重命名 data.table 的问题

Posted

技术标签:

【中文标题】重命名 data.table 的问题【英文标题】:Issue with renaming data.table 【发布时间】:2017-12-18 05:39:04 【问题描述】:

所以我有以下 data.table 问题:

library(data.table)
dt1<-data.table(V1=runif(10),V2=sample(10),ID=1:10)
     dt1
                V1 V2 ID
     1: 0.26880759 10  1
     2: 0.59148373  9  2
     3: 0.15106101  8  3
     4: 0.64780998  5  4
     5: 0.09067745  7  5
     6: 0.57337100  2  6
     7: 0.17920313  3  7
     8: 0.87948063  4  8
     9: 0.25167438  1  9
    10: 0.82715461  6 10

并且我希望执行一列重命名(除了一列,即“ID”)。尽管names(dt1[,-"ID"]) 工作正常产生:

[1] "V1" "V2"

以下命令失败:

   names(dt1[,-"ID"])<-c("souksou","mouksou")
   Error in -"ID" : invalid argument to unary operator

当然可以通过以下方式绕过该问题:

names(dt1)[!(names(dt1)  %in% "ID")]<-c("souksou","mouksou")

names(dt1)
[1] "souksou" "mouksou" "ID"

我向社区提出的问题是为什么会发生这种情况。

【问题讨论】:

你需要使用setnames函数 @Cath 详细说明... setnames(dt1, c("V1", "V2"), c("souksou","mouksou"))setnames 是在 data.table 中通过引用重命名列的方式@ 您不能设置子集的名称。您只能更改名称的子集。 【参考方案1】:

将我的评论放在一个更明显的答案中:在 data.table 中,函数 setnames 允许通过引用重命名列(全部或其中的一部分)。

试试?setnames 看看它是如何工作的。基本上,您需要为函数提供 3 个参数,xoldnewx 是您的 data.tableold 是您要重命名的变量的名称或索引(如果您想重命名所有变量,old 可以是新名称,您不需要提供 new),new 是新列名。

在您的示例中,您需要这样做:

setnames(dt1, c("V1", "V2"), c("souksou","mouksou"))

【讨论】:

【参考方案2】:

我会建议另一种方式(也许更简单)。

names(dt1) = gsub('V1', 'souksou', names(dt1))
names(dt1) = gsub('V2', 'mouksou', names(dt1))

【讨论】:

以上是关于重命名 data.table 的问题的主要内容,如果未能解决你的问题,请参考以下文章

重命名列名的后缀部分,但保持其余部分相同

将.SD与重命名的变量相结合,会使.SD列的名称混乱。

重命名目录锁定重命名目录我第二次要重命名

关于 java 重命名文件夹的问题?

redis键重命名

获取 Perl 重命名实用程序而不是内置的重命名