【问题标题】:Rename suffix part of column name but keep the rest the same重命名列名的后缀部分,但保持其余部分相同
【发布时间】:2019-05-12 21:15:06
【问题描述】:

现在我正在重做合并,因为我对列的命名不正确,但是,我想知道如何匹配列名的后缀并重命名列的该部分,保持其余部分相同。

例如,如果我有一个 data.frame(也可以是一个 data.table,没关系 - 我可以转换它):

d <- data.frame("ID" = c(1, 2, 3),
                "Attribute1.prev" = c("A", "B", "C"),
                "Attribute1.cur" = c("D", "E", "F"))

现在假设有数百列类似于我的示例 DT 中的第 2 列和第 3 列。我将如何检查并检测以".prev" 结尾的所有列更改为".1" 以及所有以".cur" 结尾的列更改为".2"

因此,新的列名称将是:ID(未更改)、Attribute1.1Attribute1.2 等等,以匹配尽可能多的列。

【问题讨论】:

    标签: r regex rename suffix


    【解决方案1】:

    使用基数 R 我们可以这样做

    names(d) <- sub("\\.prev", ".1", sub("\\.cur", ".2", names(d)))
    d
    #   ID Attribute1.1 Attribute1.2
    # 1  1            A            D
    # 2  2            B            E
    # 3  3            C            F
    

    您还可以使用stringr

    names(d) <- str_replace_all(names(d), c("\\.prev" = ".1", "\\.cur" = ".2"))
    

    如果不是Attribute1Attribute2,您可能有一些带有点/空格的名称,您也可以将"\\.prev""\\.cur" 模式替换为"\\.prev$""\\.cur$",以确保我们匹配它们位于列名的末尾。

    【讨论】:

    • stringr 会更快吗?
    • 你真的需要速度吗? 100 列的时间应该可以忽略不计。我刚刚对一个有 100,000 列的框架进行了基准测试,并且执行 Julius 的 double-dubsub 重命名不到 0.1 秒。您的时间可能会花在更耗时的操作上。
    • @Bear,我同意 r2evans,但您可能会看到,例如,stackoverflow.com/a/29275120/1320535 以了解速度差异。
    【解决方案2】:

    这是一个使用dplyr & stringr 语法的想法

    library(dplyr); library(stringr)
    names(d) <- 
      d %>% names() %>% 
      str_replace(".prev", ".1") %>% 
      str_replace(".cur", ".2")
    

    干杯!

    【讨论】:

      【解决方案3】:

      这是gsubfn的选项

      library(gsubfn)
      names(d) <- gsubfn("(\\w+)", list(prev = 1, cur = 2), names(d))
      names(d)
      #[1] "ID"           "Attribute1.1" "Attribute1.2"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-30
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        相关资源
        最近更新 更多