【问题标题】:dplyr::rename_all & dplyr::if_elsedplyr::rename_all & dplyr::if_else
【发布时间】:2021-10-22 18:59:48
【问题描述】:

我有以下数据框:

library(dplyr)

df <- data.frame(gh225 = "foo1", gh765 = "foo2", gauskper = "foo3") %>% 
  rename_all(funs(stringr::str_replace_all(., "gh", "v")))

我想将 rename_all 与 if_else 结合使用,但我找不到方法,逻辑是这样的(但带有变量):

if_else(stringr::str_detect(columns, "au"), "id_per", columns)

一句话,我想把名字gauskper改成id_per。

【问题讨论】:

    标签: r string dplyr


    【解决方案1】:

    我们可能会使用rename_with,因为rename_all 已被弃用

    library(dplyr)
    library(stringr)
    data.frame(gh225 = "foo1", gh765 = "foo2", gauskper = "foo3") %>% 
          rename_with(~ str_replace(., "au", "idper"), contains("au"))
    

    关于if_else的使用,只需要一个lambda表达式即~

    data.frame(gh225 = "foo1", gh765 = "foo2", gauskper = "foo3") %>%  
           rename_with(~ if_else(str_detect(., "au"), "id_per", .), everything())
      gh225 gh765 id_per
    1  foo1  foo2   foo3
    

    【讨论】:

      【解决方案2】:

      您可以将条件组合在一个函数中

      df %>% 
        rename_all(
          .funs = function(x){
            x %>% 
              stringr::str_replace_all(., "gh", "v") %>% 
              stringr::str_replace_all(., "gauskper", "id_per")
          }
      )
      

      【讨论】:

        【解决方案3】:

        akrun 已经回答了这个问题并且是最好的,但是当我正确理解你时:

        “说白了,我想把名字gauskper改成id_per。”

        然后

        实现这一目标的最佳方法是:

        library(dplyr)
        df %>% 
          rename(id_per = gauskper)
        
          gh225 gh765 id_per
        1  foo1  foo2   foo3
        

        【讨论】:

          猜你喜欢
          • 2018-01-14
          • 2018-11-11
          • 2018-08-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-07
          • 2018-05-10
          • 2019-01-06
          • 2020-05-21
          相关资源
          最近更新 更多