我们可以使用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,默认情况下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.unique 和sep="_" 分配列名
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"