使用dplyr named_ *有条件地重命名变量

时间:2019-07-17 17:09:18

标签: r dplyr

说我想通过在所有以数字开头的变量名称之前添加前缀来有条件地重命名变量。当我尝试使用rename_ *函数执行此操作时,遇到错误。

library(dplyr)
library(stringr)

ds <- 
  tibble(
    `4 grade` = c(1,2,3),
    `6 grade` = c(1,2,3),
    `G8 grade` = c(1,2,3),
  )

ds

# my function works with rename_all
ds %>% rename_all( ~ paste0("G", .) )

# but when I try to apply my function conditionally I get an error
ds %>% rename_at( vars(starts_with("[[:digit:]]")), ~paste0("G", .) )
ds %>% rename_at( vars(str_detect("^[[:digit:]]")), ~paste0("G", .) )
ds %>% rename_if( str_detect("^[[:digit:]]"), ~paste0("G", .) )

如何将条件逻辑与rename_ *一起使用以指定要重命名的变量?

3 个答案:

答案 0 :(得分:2)

一种可能是:

ds %>%
 rename_at(grep("^[0-9]", names(.), value = TRUE), list(~ paste0("G", .)))

  `G4 grade` `G6 grade` `G8 grade`
       <dbl>      <dbl>      <dbl>
1          1          1          1
2          2          2          2
3          3          3          3

答案 1 :(得分:2)

有一个名为tidyselect的{​​{1}}辅助函数,可以对变量名进行正则表达式搜索。请注意,matches不起作用,因为它仅接受字符串文字:

starts_with

输出:

library(dplyr)

ds %>%
  rename_at(vars(matches("^[0-9]")), ~ paste0("G", .))

答案 2 :(得分:1)

可能性(重新命名)。正如@IceCreamToucan所建议的,我们实际上不需要捕获第二个组,因此不需要原始正则表达式中的\\2部分。 :

  names(ds) <- ds %>% 
   names() %>% 
  str_replace_all(.,"(^[0-9])(\\s+)","G\\1") 
 ds
# A tibble: 3 x 3
  `G4 grade` `G6 grade` `G8 grade`
       <dbl>      <dbl>      <dbl>
1          1          1          1
2          2          2          2
3          3          3          3

此外,如@IceCreamToucan所建议,我们可以将其与rename_all一起使用,以保持与OP相同的逻辑。

ds %>% 
rename_all(str_replace_all, "(^[0-9])", "G\\1")