R语言中如何保留重复列名的首个实例
保留数据集末尾带数字的重复列的首个实例
问题描述
数据集列名末尾带有数字且存在重复,需要保留每个列名系列的首个实例,由于数据规模大、重复列种类多,无法手动指定列名。
示例数据
ID...1<-c(1,2,3) ID...2<-c(1,2,3) Month...1<-c(1,2,3) Month...2<-c(1,2,3) Month...3<-c(1,2,3) Month...4<-c(1,2,3) have<-as.data.frame(cbind(ID...1,ID...2,Month...1,Month...2,Month...3,Month...4)) # 查看原数据 have
输出:
ID...1 ID...2 Month...1 Month...2 Month...3 Month...4 [1,] 1 1 1 1 1 1 [2,] 2 2 2 2 2 2 [3,] 3 3 3 3 3 3
期望结果
ID...1 Month...1 [1,] 1 1 [2,] 2 2 [3,] 3 3
解决方案
方法1:基础R实现(通用场景)
通过正则提取列名核心前缀,标记首个实例后筛选:
# 提取列名的核心部分(去除末尾的...+数字) core_colnames <- sub("\\.\\.\\.\\d+$", "", colnames(have)) # 获取每个核心列名首次出现的索引 keep_cols <- !duplicated(core_colnames) # 筛选得到目标数据集 want <- have[, keep_cols] # 查看结果 want
方法2:dplyr实现(适用于首个实例后缀为...1的情况)
如果首个实例固定以...1结尾,可以直接匹配这类列:
library(dplyr) want <- have %>% select(matches("^.+\\.\\.\\.1$")) # 查看结果 want
两种方法都能得到期望结果:方法1更通用,即使首个实例的数字不是1也能处理;方法2更简洁,适合示例场景。
内容的提问来源于stack exchange,提问作者user30397791
相关产品推荐
相关产品推荐

