如何删除 R 中 data.tables 中的重复(按名称)列?
How to remove duplicated (by name) column in data.tables in R?
在使用 fread
读取数据集时,我注意到有时会出现重复的列名,例如(fread
没有 check.names
参数)
> data.table( x = 1, x = 2)
x x
1: 1 2
问题是:如果 2 列具有相同的名称,是否有任何方法可以删除其中的 1 列?
不同的方法:
索引
my.data.table <- my.data.table[ ,-2]
子集
my.data.table <- subset(my.data.table, select = -2)
创建唯一名称 如果 1. 和 2. 不理想(例如,当有数百列时)
setnames(my.data.table, make.names(names = names(my.data.table), unique=TRUE))
可选地系统化删除 名称符合某些标准的变量(在这里,我们将删除名称以“.X”结尾的所有变量(X 为数字,使用 make.names
时从 2 开始)
my.data.table <- subset(my.data.table,
select = !grepl(pattern = "\.\d$", x = names(my.data.table)))
怎么样
dt[, .SD, .SDcols = unique(names(dt))]
这会选择每个名字的 第一次 出现(我不确定你想如何处理这个)。
正如@DavidArenburg 在上面的评论中所建议的,您可以在 data.table()
或 fread()
中使用 check.names=TRUE
.SDcols
方法将 return 您选择的列的 副本 。相反,只需使用 :=
通过引用删除那些重复的列。
dt[, which(duplicated(names(dt))) := NULL]
# x
# 1: 1
在使用 fread
读取数据集时,我注意到有时会出现重复的列名,例如(fread
没有 check.names
参数)
> data.table( x = 1, x = 2)
x x
1: 1 2
问题是:如果 2 列具有相同的名称,是否有任何方法可以删除其中的 1 列?
不同的方法:
索引
my.data.table <- my.data.table[ ,-2]
子集
my.data.table <- subset(my.data.table, select = -2)
创建唯一名称 如果 1. 和 2. 不理想(例如,当有数百列时)
setnames(my.data.table, make.names(names = names(my.data.table), unique=TRUE))
可选地系统化删除 名称符合某些标准的变量(在这里,我们将删除名称以“.X”结尾的所有变量(X 为数字,使用
make.names
时从 2 开始)my.data.table <- subset(my.data.table, select = !grepl(pattern = "\.\d$", x = names(my.data.table)))
怎么样
dt[, .SD, .SDcols = unique(names(dt))]
这会选择每个名字的 第一次 出现(我不确定你想如何处理这个)。
正如@DavidArenburg 在上面的评论中所建议的,您可以在 data.table()
或 fread()
check.names=TRUE
.SDcols
方法将 return 您选择的列的 副本 。相反,只需使用 :=
通过引用删除那些重复的列。
dt[, which(duplicated(names(dt))) := NULL]
# x
# 1: 1