我觉得我缺少一些基本的知识,但是我无法将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
一起使用。
答案 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