dplyr :: rename_at给出错误“必须评估列位置或名称”

时间:2018-08-07 23:54:00

标签: r dplyr

我觉得我缺少一些基本的知识,但是我无法将rename_at与自定义重命名功能一起使用:

library(tidyverse)

说我想交换名称以Sepal开头的列的Sepal和度量。我希望这能奏效,但不会:

iris %>%
  rename_at(vars(starts_with("Sepal"), funs(str_replace(., "(Sepal)\\.(.*)", "\\2\\.\\1"))))
#> Warning: 'glue::collapse' is deprecated.
#> Use 'glue_collapse' instead.
#> See help("Deprecated") and help("glue-deprecated").
#> Error: `funs(str_replace(., "(Sepal)\\.(.*)", "\\2\\.\\1"))` must evaluate to column positions or names, not a list

如果我包装函数调用并且不使用funs(),也不起作用:

sepal_renamer <- function(names){
  str_replace(names, "(Sepal)\\.(.*)", "\\2\\.\\1")
}
iris %>%
  rename_at(vars(starts_with("Sepal"), sepal_renamer))
#> Warning: 'glue::collapse' is deprecated.
#> Use 'glue_collapse' instead.
#> See help("Deprecated") and help("glue-deprecated").
#> Error: `sepal_renamer` must evaluate to column positions or names, not a function

我知道我可以使用正则表达式获得所需的结果,但是我不明白为什么它适用于rename_all(甚至colnames<-())而不是rename_at。而且,即使无法用正则表达式进行正确的替换,我也想要一个解决方案(例如尝试将某些名称映射到新名称)

iris %>% rename_all(funs(str_replace(., "(Sepal)\\.(.*)", "\\2\\.\\1"))) %>% colnames
#> [1] "Length.Sepal" "Width.Sepal"  "Petal.Length" "Petal.Width" 
#> [5] "Species"

iris %>% `colnames<-`(str_replace(colnames(.), "(Sepal)\\.(.*)", "\\2\\.\\1")) %>% colnames
#> [1] "Length.Sepal" "Width.Sepal"  "Petal.Length" "Petal.Width" 
#> [5] "Species"

任何人都有任何建议-我是否缺少一些基本的语法内容?该错误对我而言并没有什么直观的提示,而且我更加困惑,因为它仍然可以与rename_all一起使用。

1 个答案:

答案 0 :(得分:3)

我认为您的括号位置错误。 )函数的结尾vars()错位了:

iris %>%
  rename_at(vars(starts_with("Sepal")), ~str_replace(., "(Sepal)\\.(.*)", "\\2\\.\\1")) %>% 
  head(2)

  Length.Sepal Width.Sepal Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa