如何重命名与当前一加一相似的列?

How to rename the columns that are similar to current one plus one?

你能帮我解决这个问题吗:我有一个数据集,其中列是数值。 一些列是连续的。我想用与序列开始的列相同的名称重命名那些序列列。

这里有一个与此示例相似的数据集:

fake_dataset <- data.frame(sample = paste0("sample_", sample(1:100, replace = T)),
                               "1678.47647" = runif(100, 1, 2),
                               "1679.84733" = runif(100, 1, 3),
                               "1680.87487" = runif(100, 2, 4),
                               "1800.35463" = runif(100, 1, 2),
                               "1811.47463" = runif(100, 2, 3),
                               "1823.52342" = runif(100, 2, 5)
                               )
    
    
colnames(fake_dataset) <- c("sample",
                                "1678.47647",
                                "1679.84733",
                                "1680.87487",
                                "1800.35463",
                                "1811.47463",
                                "1823.52342")
    
fake_dataset$sample <- NULL

我的逻辑是将下一个顺序列的列名称值重命名为与前一个相同的名称,如下所示:

test <- function(data){
  new_names <- c()
  counter <- 0
  for (i in as.integer(colnames(fake_dataset))){
    counter <- counter + 1
    if(as.character( as.integer( names( data[counter] ) )) == as.character( as.integer( names( data[counter] ) )+1) ) {
      print("same!\n")
      colname( data[, counter]) <- colnames( data[, counter + 1])
    }else{
      print("different!\n")
    }
  }
}

但我还没有成功。有人能帮忙吗? 谢谢你的时间。

我们可以将 colnames 转换为 integer,获取相邻元素之间的 difference 以创建分组变量,在 ave 中使用 [=27] =] 向量的第一个元素并将其作为列名重新分配。

v1 <- as.integer(colnames(fake_dataset))
grp <- cumsum(c(TRUE, diff(v1) != 1))
new <- ave(v1, grp, FUN = function(x) x[1])

colnames(fake_dataset) <- new

-输出

> colnames(fake_dataset)
[1] "1678" "1678" "1678" "1800" "1811" "1823"

注意:data.frame/tibble/data.table 不支持重复的列名。通过使用 make.unique,即为重复添加 .1.2,它将在后续转换中更改为唯一值。但是,对于 matrix,允许重复的列名