使用rename_if()和starts_with()函数为特定列添加前缀

5

我的数据长这样:

#>           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个回答

10

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,我们可以使用带有vars参数的rename_at
df1 %>% rename_at(vars(starts_with("A")), ~paste0("df1_", .))

1
这个编辑对我非常有帮助,解释了rename_atrename_if之间的区别。以前我从来没有理解过这两者的区别。谢谢。 - Jeremy K.
顺便问一下,你有没有推荐我学习rename_atrename_if以及purrr函数的特定资料?Hadley的R4DS是否是最适合我的学习材料? - Jeremy K.
3
很遗憾,我不是最适合回答这个问题的人,因为我没有仔细阅读过在线资源。我的知识主要来自于阅读其他人在这里的答案,并在回答问题时查看函数的文档。 - Ronak Shah

4
我们可以使用

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接