在使用管道运算符时将dplyr重命名应用于所有列

时间:2015-12-04 15:54:47

标签: r syntax dataframe dplyr

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

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.

期望的结果

我想要实现的目标可以在基地完成:

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

会返回:

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

我希望使用dyplr%>%达到相同的效果。

5 个答案:

答案 0 :(得分:16)

我知道这是一个老问题,我确定你现在找到了解决方案,但我偶然发现了同样的问题,并最终找到了一些新方法。

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在它处理的列名中非常灵活。如果这是一个交易破坏者,你可以在snakecase函数中使用另一个包to_big_camel_case()作为其函数rename_all ......虽然这开始变得有点过于深奥

答案 1 :(得分:2)

mtcars %>% 
  data.table::setnames(
    old = mtcars %>% names(),
    new = mtcars %>% names() %>% paste0("_new_name")
  )

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

mtcars %>% names()以管道mtcars的方式输出数据框%>%的列名,因此您也可以使用names(mtcars)。他们是一回事。

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

答案 2 :(得分:1)

你也可以尝试这个

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"

答案 3 :(得分:1)

使用StringrDplyr,以及dot operator

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

答案 4 :(得分:0)

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

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