R语言如何筛选列名唯一的列,排除重复列名的冗余列?
基础R实现(无需依赖第三方包)
核心逻辑是通过duplicated()判断列名的重复状态,仅保留首次出现的列:
# 假设你的数据集存储为数据框df df_filtered <- df[, !duplicated(colnames(df))]
duplicated(colnames(df))会返回与列数等长的逻辑向量,首次出现的列名对应值为FALSE,后续重复出现的对应值为TRUE,取反后索引即可筛选出所有列名第一次出现的列。
可以用以下测试代码验证效果,和你给出的数据集结构完全一致:
# 构造模拟数据集,保留原生重复列名 df_test <- data.frame( Samples = c("S1", "S2", "S3"), col1 = c(12, 25, 18), col2 = c(32, 17, 9), col3 = c(4, 6, 2), col4 = c(7, 3, 5), col2 = c(0.001, 0.003, 0.002), col1 = c(0.0005, 0.0002, 0.0004), check.names = FALSE # 关闭R默认自动重命名重复列的机制 ) # 执行列去重 df_filtered <- df_test[, !duplicated(colnames(df_test))] # 查看输出列名,符合仅保留首次出现列的要求 colnames(df_filtered) # 输出结果:[1] "Samples" "col1" "col2" "col3" "col4"
注意事项
如果是从本地csv/tsv文件读入数据集,需要在读入时添加check.names = FALSE参数,避免R自动给重复列名加.1/.2后缀导致去重逻辑失效:
# 读入数据示例 df <- read.csv("你的数据集文件路径.csv", check.names = FALSE, row.names = 1)
dplyr 实现(适配tidyverse工作流)
如果你习惯用tidyverse套件处理数据,可以用如下写法:
library(dplyr) df_filtered <- df %>% select(which(!duplicated(colnames(.))))
内容的提问来源于stack exchange,提问作者camcecc10
相关产品推荐
相关产品推荐

