我正在使用与下面的摘录对应的导入数据集:
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
和%>%
达到相同的效果。
答案 0 :(得分:16)
我知道这是一个老问题,我确定你现在找到了解决方案,但我偶然发现了同样的问题,并最终找到了一些新方法。
使用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
是重命名数据框中的列名。 old
和new
是我们需要的这个函数中的两个参数。
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)
使用Stringr和Dplyr,以及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