【问题标题】:Applying dplyr's rename to all columns while using pipe operator使用管道运算符时将 dplyr 重命名应用于所有列
【发布时间】:2016-03-09 14:46:57
【问题描述】:

我正在使用与以下摘录相对应的导入数据集:

set.seed(1)
dta <- data.frame("This is Column One" = runif(n = 10),
                     "Another amazing Column name" = runif(n = 10),
                     "!## This Columns is so special€€€" = runif(n = 10),
                    check.names = FALSE)

我正在使用dplyr 对这些数据进行一些清理,并且我想将列名更改为语法正确的列名并删除标点符号作为第二步。到目前为止我尝试了什么:

dta_cln <- dta %>% 
    rename(make.names(names(dta)))

产生错误:

> dta_clean <- dta %>% 
+     rename(make.names(names(dta)))
Error: All arguments to rename must be named.

想要的结果

我想要实现的可以在base中完成:

names(dta) <- gsub("[[:punct:]]","",make.names(names(dta)))

会返回:

> names(dta)
[1] "ThisisColumnOne"          "AnotheramazingColumnname" "XThisColumnsissospecial"

我想达到同样的效果,但使用dyplr 和%&gt;%。

【问题讨论】:

  • 看起来像是对this的一些调整
  • @akrun 非常感谢,我会按照链接答案中的建议尝试使用setNames(tolower(gsub("\\.","_",names(.)))) 做一些事情。
  • 唯一的问题是 rename 中的某些字符无法很好地解析。
  • 是的:Error in parse(text = x) : &lt;text&gt;:1:9: unexpected symbol 1: Service Condiitions
  • 调整后,this 就可以了。

标签: r syntax dataframe dplyr


【解决方案1】:

使用Stringr 和Dplyr,以及dot operator:

dta %>%
   dplyr::rename_all(funs(
                     stringr::str_replace_all( ., "[[:punct:]]", "_" )
   ))

【讨论】:

    【解决方案2】:

    使用管道设置列名,如下所示:

    iris %>% `colnames<-`(c("newcol1", "newcol2", "newcol3", "newcol4", "newcol5"))
    

    返回

        newcol1 newcol2 newcol3 newcol4    newcol5
    1       5.1     3.5     1.4     0.2     setosa
    2       4.9     3.0     1.4     0.2     setosa
    3       4.7     3.2     1.3     0.2     setosa
    

    【讨论】:

      【解决方案3】:
      mtcars %>% 
        data.table::setnames(
          old = mtcars %>% names(),
          new = mtcars %>% names() %>% paste0("_new_name")
        )
      

      data.table 包中的函数setnames 是重命名数据框中的列名。 old 和 new 是我们需要的这个函数中的两个参数。

      mtcars %&gt;% names()以管道%&gt;%的方式输出数据框mtcars的列名,所以你也可以使用names(mtcars)。它们是一样的。

      在这个最小的示例中,我重命名管道 %&gt;% 中的列名,并使用 paste0 函数添加所有带有后缀的旧列名。您可以添加前缀、后缀或其他规则。

      【讨论】:

      • 请为您的答案添加一些解释。例如,为什么您的答案比公认的答案更好?
      【解决方案4】:

      你也可以试试这个

      set.seed(1)
      dta <- data.frame("This is Column One" = runif(n = 10),
                       "Another amazing Column name" = runif(n = 10),
                       "!## This Columns is so special€€€" = runif(n = 10),
                      check.names = FALSE)
      
      dta <- dta  %>% 
        setNames(gsub("[^[:alnum:] ]", perl = TRUE,
                  "",
                  names(.))) %>% 
        setNames(gsub("(\\w)(\\w*)",
                  "\\U\\1\\L\\2",
                  perl = TRUE,
                  names(.)))
      
      names(dta)
      [1] "This Is Column One"          "Another Amazing Column Name" " This Columns Is So Special"
      

      【讨论】:

      • 这应该是公认的答案。其他的取决于首先分配的数据框,然后才能更改 colnames。谢谢!
      【解决方案5】:

      我知道这是一个老问题,我相信您现在已经找到了解决方案,但我偶然发现这里寻找相同的问题,并最终找到了一些新的方法来做到这一点。

      Dplyr

      使用dplyr 0.6.0及以上,现在有一个rename_all函数:

        dta %>% 
          rename_all(funs(gsub("[[:punct:]]", "", make.names(names(dta)))))
      

      这行得通,但对我来说有点乱。如果您希望dplyr 更灵活,您也可以致电:

      • rename_at
      • rename_if

      看门人

      这是一个非常不错的包(有很多额外的实用程序),可以轻松清理列名:

      library(janitor)
      
      dta %>% 
        clean_names()
      

      这会将所有列名重命名并清除为以下内容:

      [1] "this_is_column_one"  "another_amazing_column_name"  "x_this_columns_is_so_special"
      

      一切都变成了snake_case而不是CamelCase,但总的来说clean_names在它处理的列名方面非常灵活。如果这是一个交易破坏者,您可以在 rename_all 函数中使用另一个包 snakecase 作为其函数 to_big_camel_case() ......尽管这开始变得有点太深奥了

      【讨论】:

      • funs() 自 dplyr 0.8.0 起已弃用。看起来你现在想要:dta %&gt;% rename_all(list(~ gsub("[[:punct:]]", "", .))) 或(因为 rename_all() 已被 rename_with() 取代 ... dta %&gt;% rename_with(~ gsub("[[:punct:]]", "", .x))
      猜你喜欢
      • 2016-11-21
      • 1970-01-01
      • 2018-07-19
      • 2021-03-26
      • 2018-04-09
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多