R中的Uniquefy重复列名称

时间:2017-12-01 14:10:40

标签: r duplicates unique columnname

所以我加载了一个包含重复列名的Excel文件。我希望每次重复列名时都添加一个后缀。所以:

problem_df <- data.frame(A = rep(1, 5), B = rep(2, 5), A = rep(3, 5), B = rep(4, 5), A = rep(5, 5))
solution_df <- data.frame(A = rep(1, 5), B = rep(2, 5), A_1 = rep(3, 5), B_1 = rep(4, 5), A_2 = rep(5, 5))

或者列名称后缀可以是&#39; _2&#39;和&#39; _3&#39;。

1 个答案:

答案 0 :(得分:2)

我们可以使用make.unique也有sep参数

make.unique(c("A", "B", "A", "B", "A"), sep="_")
#[1] "A"   "B"   "A_1" "B_1" "A_2"

在我们的'problem_df'中,data.frame来电正在使用check.names = TRUE,该make.names调用调用make.unique的{​​{1}},默认为sep.

在检查data.frame时,它位于从第124行开始的代码块中

  if (check.names) {
    if (fix.empty.names) 
        vnames <- make.names(vnames, unique = TRUE) ###
    else {
        nz <- nzchar(vnames)
        vnames[nz] <- make.names(vnames[nz], unique = TRUE) ###
    }
}
names(value) <- vnames  

一种方法是使用check.names = FALSE,然后使用make.uniquesep="_"

分配列名称
problem_df <- data.frame(A = rep(1, 5), B = rep(2, 5), A = rep(3, 5),
       B = rep(4, 5), A = rep(5, 5), check.names = FALSE)
names(problem_df) <- make.unique(names(problem_df), sep="_")

或者使用sub假设数据集对象是使用.\\d+作为重复名称的列名创建的

sub("\\.", "_", names(problem_df))
#[1] "A"   "B"   "A_1" "B_1" "A_2"