如何删除R中data.tables中的重复(按名称)列?

时间:2015-03-16 21:45:16

标签: r data.table

在使用fread阅读数据集时,我注意到有时我会获得重复的列名,例如(fread没有{{1}参数)

check.names

问题是:如果它们具有相同的名称,有没有办法删除2列中的1列?

3 个答案:

答案 0 :(得分:11)

怎么样

dt[,unique(names(dt)),with=FALSE]

?来自?data.table

  

j:单列名,列名的单个表达,             'list()'表示列名,表达式或             计算结果为'list'的函数调用(包括             'data.frame'和'data.table'也是'list',或者             (当'with = FALSE'时)要选择的名称或位置向量。

这会选择每个名称的第一个出现(我不知道你想怎么处理这个)。

正如@DavidArenburg在上面的评论中建议的那样,您可以在check.names=TRUE中使用data.table()(但是,我在check.names中看不到fread()选项 - 也许我错过了什么。)

答案 1 :(得分:9)

with=FALSE会返回您正在选择的列的副本。相反,只需使用:=,通过引用删除这些重复的列。

dt[, which(duplicated(names(dt))) := NULL]
#    x
# 1: 1

答案 2 :(得分:3)

不同的方法:

  1. <强>索引

    my.data.table <- my.data.table[ ,-2, with=FALSE]

  2. <强>子集

    my.data.table <- subset(my.data.table, select = -2)

  3. 制作唯一名称如果1.和2.不理想(例如,当有数百列时)

    setnames(my.data.table, make.names(names = names(my.data.table), unique=TRUE))

  4. Optionnaly系统化删除的变量名称符合某些标准(这里,我们将删除所有名称以&#34; .X&#34; (X是一个数字,使用make.names时从2开始)

    my.data.table <- subset(my.data.table, select = !grepl(pattern = "\\.\\d$", x = names(my.data.table)))