【问题标题】:rename_if() together with starts_with() to prefix certain columns [duplicate]rename_if() 与 starts_with() 一起为某些列添加前缀[重复]
【发布时间】:2019-11-03 20:57:56
【问题描述】:

我的数据如下所示:

#>           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)
)

【问题讨论】:

    标签: r dplyr rename tidyverse purrr


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      rename_if 需要一个逻辑向量作为谓词函数。 starts_with 根据名称选择变量。使用 base 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_", .))
      

      【讨论】:

      • 这个编辑非常有助于向我解释rename_atrename_if 之间的区别。我以前从未理解过其中的区别。谢谢。
      • 顺便问一下,你有没有推荐任何特定的资源让我学习rename_atrename_if 和 purrr 函数之类的东西? Hadley 的 R4DS 对我来说是不是最好的工作?
      • @RANdStata 不幸的是,我不是回答这个问题的最佳人选,因为我没有阅读太多在线资源。我的知识主要来自在这里阅读其他人的答案并在尝试回答问题时检查函数文档。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 2013-11-03
      • 2013-01-30
      相关资源
      最近更新 更多