rename_if() 和 starts_with() 为某些列添加前缀

Jer*_* K. 5 r rename dplyr purrr tidyverse

我的数据如下所示:

#>           Artist          Album Year
#> 1        Beatles  Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971
Run Code Online (Sandbox Code Playgroud)

我的问题应该很简单。我试图只使用rename_if以字母“A”开头的列作为前缀。所以我想要的输出是:

#>       df1_Artist      df1_Album Year
#> 1        Beatles  Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971
Run Code Online (Sandbox Code Playgroud)

您可以看到不应以“年份”为前缀。

这是我的尝试,但效果不佳。我使用starts_with不正确吗?我应该试着把它分成两行,这样我才能更清楚地理解它吗?我还在学习 purrr 风格的函数,所以它对我来说并不总是很直观。

df1 %>% rename_if(starts_with("A"), .funs = ~ paste0(df1, .))
#> Error in df1 %>% rename_if(starts_with("A"), .funs = ~paste0(df1, .)): could not find function "%>%"
Run Code Online (Sandbox Code Playgroud)

数据输入代码:

df1 <- data.frame(stringsAsFactors=FALSE,
      Artist = c("Beatles", "Rolling Stones"),
       Album = c("Sgt. Pepper's", "Sticky Fingers"),
        Year = c(1967, 1971)
)
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 9

rename_if期望一个逻辑向量作为谓词函数。starts_with根据名称选择变量。使用 basestartsWith代替它返回基于前缀的逻辑向量

library(dplyr)
df1 %>% rename_if(startsWith(names(.), "A"), ~paste0("df1_", .))

#      df1_Artist      df1_Album Year
#1        Beatles  Sgt. Pepper's 1967
#2 Rolling Stones Sticky Fingers 1971
Run Code Online (Sandbox Code Playgroud)

或者如果你想留在tidyverse你也可以使用str_detect

df1 %>% rename_if(stringr::str_detect(names(.), "^A"), ~paste0("df1_", .))
Run Code Online (Sandbox Code Playgroud)

要使用,starts_with我们可以使用rename_atwhich 有vars参数。

df1 %>% rename_at(vars(starts_with("A")), ~paste0("df1_", .))
Run Code Online (Sandbox Code Playgroud)

  • @RAndStata 不幸的是,我不会成为回答这个问题的最佳人选,因为我没有在网上阅读很多资源。我的知识主要来自在这里阅读其他人的答案并在尝试回答问题时检查函数文档。 (3认同)