named_if()与starts_with()一起为某些列添加前缀

时间:2019-06-21 02:30:57

标签: r dplyr rename tidyverse purrr

我的数据如下:

#>           Artist          Album Year
#> 1        Beatles  Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971

我的问题应该很简单。我正在尝试使用rename_if仅对以字母“ A”开头的列添加前缀。所以我想要的输出是:

#>       df1_Artist      df1_Album Year
#> 1        Beatles  Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971

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

这是我的尝试,但效果不佳。我使用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 "%>%"

数据输入代码:

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

2 个答案:

答案 0 :(得分:4)

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

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

或者,如果您想留在tidyverse中,也可以使用str_detect

df1 %>% rename_if(stringr::str_detect(names(.), "^A"), ~paste0("df1_", .))

要使用starts_with,我们可以使用具有rename_at参数的vars

df1 %>% rename_at(vars(starts_with("A")), ~paste0("df1_", .))

答案 1 :(得分:1)

我们可以使用

library(tidyverse)
df1 %>%
  rename_at(vars(starts_with("A")), ~ str_c("df1_", .))
#     df1_Artist      df1_Album Year
#1        Beatles  Sgt. Pepper's 1967
#2 Rolling Stones Sticky Fingers 1971