【问题标题】:Removing suffix from column names using rename_all?使用 rename_all 从列名中删除后缀?
【发布时间】:2018-02-08 03:49:40
【问题描述】:

我有一个数据框,其中包含多个列,格式为 var1.mean、var2.mean。我想从包含它的所有列中删除后缀“.mean”。我尝试在管道中将 rename_all 与正则表达式结合使用,但无法提出正确的语法。有什么建议?

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    使用新的 dplyr:

    df %>% rename_with(~str_remove(., '.mean'))
    

    【讨论】:

      【解决方案2】:

      您可以使用gsub

      colnames(df) <- gsub('.mean','',colnames(df))
      

      【讨论】:

        【解决方案3】:

        已经给出了很多快速的答案,对我来说最直观的答案是:

        Dframe <- data.frame(var1.mean = rnorm(10),        #Create Example
                             var2.mean = rnorm(10),
                             var1.sd = runif(10))
        names(Dframe) <- gsub("[.]mean","",names(Dframe))  #remove ".mean"
        

        【讨论】:

          【解决方案4】:

          我们可以使用rename_all

          df1 %>%
             rename_all(.funs = funs(sub("\\..*", "", names(df1)))) %>%
             head(2)
          #        var1        var2       var3       var1       var2       var3
          #1 -0.5458808 -0.09411013  0.5266526 -1.3546636 0.08314367  0.5916817
          #2  0.5365853 -0.08554095 -1.0736261 -0.9608088 2.78494703 -0.2883407
          

          注意:如果列名重复,则需要使用make.unique使其唯一

          数据

          set.seed(24)
          df1 <- as.data.frame(matrix(rnorm(25*6), 25, 6, dimnames = list(NULL,
                       paste0(paste0("var", 1:3), rep(c(".mean", ".sd"), each = 3)))))
          

          【讨论】:

            【解决方案5】:

            我会使用字符串拆分:

            x <- as.data.frame(matrix(runif(16), ncol = 4))
            colnames(x) <- c("var1.mean", "var2.mean", "var3.mean", "something.else")
            
            colnames(x) <- strsplit(colnames(x), split = ".mean")
            colnames(x)
            

            【讨论】:

              【解决方案6】:

              如果你想使用dplyr 包,我建议使用rename_at 函数。

              Dframe <- data.frame(var1.mean = rnorm(10),
                                   var2.mean = rnorm(10),
                                   var1.sd = runif(10))
              
              library(dplyr)
              
              Dframe %>% 
                rename_at(.vars = vars(ends_with(".mean")),
                          .funs = funs(sub("[.]mean$", "", .)))
              

              【讨论】:

              • 在 rename_at() 中,¿为什么要包含 .vars 和 .funs?
              • 这些是rename_at 的参数名称。
              • funsrename_at 已被弃用/取代。你现在应该使用rename_with(~ gsub("[.]mean$", "", .x)
              【解决方案7】:

              您可以使用 stringistri_replace_last_regex 函数替换此名称,如下所示:

              require(stringi)
              df <- data.frame(1,2,3,4,5,6)
              names(df) <- stri_paste("var",1:6,c(".mean",".sd"))
              df
              ##  var1.mean var2.sd var3.mean var4.sd var5.mean var6.sd
              ##1         1       2         3       4         5       6
              names(df) <- stri_replace_last_regex(names(df),"\\.mean$","")
              df
              ##  var1 var2.sd var3 var4.sd var5 var6.sd
              ##1    1       2    3       4    5       6
              

              正则表达式是\\.mean$,因为您需要转义点字符(它在正则表达式中具有特殊含义),并且您可以在末尾添加$ 符号以确保仅替换以该模式结尾的名称(如果.mean 文本位于字符串中间,因此不会被替换)。

              【讨论】:

                【解决方案8】:

                以下内容适合我

                dat <- data.frame(var1.mean = 1, var2.mean = 2)
                col_old <- colnames(dat)
                col_new <- gsub(pattern = ".mean",replacement = "", x  = col_old)
                colnames(dat) <- col_new
                

                【讨论】:

                • 使用pattern = "[.]mean$" 将确保您只更改以.mean 结尾的变量名。
                猜你喜欢
                • 2020-10-20
                • 2019-06-03
                • 1970-01-01
                • 2020-02-13
                • 2017-07-08
                • 2012-08-15
                • 2023-04-05
                • 2021-09-11
                相关资源
                最近更新 更多