【问题标题】:Replace elements of a character vector based on string in R基于R中的字符串替换字符向量的元素
【发布时间】:2020-09-01 14:33:18
【问题描述】:

所以我有一个像这样的数据框:

Occupation
ELECTRICIAN
ROAD ELECTRICIAN
ELECTRICIAN
FARMER
GRASS ELECTRICIAN
POLE ELECTRICIANS
ELECTRICIAN
INSPECTOR

所以我希望任何时候 ELECTRICIAN 看起来都只是 ELECTRICIAN,不管牢房里有什么其他东西。

所以最终产品应该是:

Occupation
ELECTRICIAN
ELECTRICIAN
ELECTRICIAN
FARMER
ELECTRICIAN
ELECTRICIAN
ELECTRICIAN
INSPECTOR

我尝试了以下方法,但没有成功....

ifelse(grep('CONDUCTOR',df$Occupation , value=TRUE), "CONDUCTOR",df$Occupation) 

【问题讨论】:

    标签: r if-statement dplyr grepl


    【解决方案1】:

    我会建议这种方法。最好使用grepl(),因为它产生的逻辑值可以在ifelse() 中轻松检测到:

    #Data
    df <- structure(list(Occupation = c("ELECTRICIAN", "ROAD ELECTRICIAN", 
    "ELECTRICIAN", "FARMER", "GRASS ELECTRICIAN", "POLE ELECTRICIANS", 
    "ELECTRICIAN", "INSPECTOR")), row.names = c(NA, -8L), class = "data.frame")
    

    代码:

    #Code
    df$Occupation <- ifelse(grepl('ELECTRICIAN',df$Occupation), 'ELECTRICIAN',df$Occupation) 
    

    输出:

       Occupation
    1 ELECTRICIAN
    2 ELECTRICIAN
    3 ELECTRICIAN
    4      FARMER
    5 ELECTRICIAN
    6 ELECTRICIAN
    7 ELECTRICIAN
    8   INSPECTOR
    

    【讨论】:

    • 既然不存在真正的“else”情况,使用直接赋值代替ifelse:df$Occupation[grepl("ELECTRICIAN", df$Occupation)] &lt;- "ELECTRICIAN"会更简洁高效。
    • @GregorThomas 你是对的,这是一个很好的建议。我只是按照 OP 问题的风格来生成解决方案!
    【解决方案2】:

    这是使用 stringr 包的 tidyverse 解决方案。

        library(stringr)      
        df$Occupation<- str_replace_all(df$Occupation,".*ELECTRICIAN.*","ELECTRICIAN")
    

    关于 tidyverse 解决方案是否是“首选”存在一些争论,但我个人更喜欢它们。我认为函数名称对您和任何可能正在阅读您的代码的人来说都更加直观。我也觉得简洁直接,做自己想做的事。

    【讨论】:

      【解决方案3】:

      使用grep,您可以获得Occupation 中存在"ELECTRICIAN" 的索引并替换这些值。

      df$Occupation[grep('ELECTRICIAN', df$Occupation)] <- 'ELECTRICIAN'
      df
      
      #   Occupation
      #1 ELECTRICIAN
      #2 ELECTRICIAN
      #3 ELECTRICIAN
      #4      FARMER
      #5 ELECTRICIAN
      #6 ELECTRICIAN
      #7 ELECTRICIAN
      #8   INSPECTOR
      

      【讨论】:

        猜你喜欢
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多