在使用fread
阅读数据集时,我注意到有时我会获得重复的列名,例如(fread
没有{{1}参数)
check.names
问题是:如果它们具有相同的名称,有没有办法删除2列中的1列?
答案 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)
不同的方法:
<强>索引强>
my.data.table <- my.data.table[ ,-2, with=FALSE]
<强>子集强>
my.data.table <- subset(my.data.table, select = -2)
制作唯一名称如果1.和2.不理想(例如,当有数百列时)
setnames(my.data.table, make.names(names = names(my.data.table), unique=TRUE))
Optionnaly系统化删除的变量名称符合某些标准(这里,我们将删除所有名称以&#34; .X&#34; (X是一个数字,使用make.names
时从2开始)
my.data.table <- subset(my.data.table,
select = !grepl(pattern = "\\.\\d$", x = names(my.data.table)))