【问题标题】:Filter Replace string that contains given pattern过滤器替换包含给定模式的字符串
【发布时间】:2018-03-20 11:05:00
【问题描述】:

我目前正在对数据集中的分类变量进行规范化。

我必须将汽车的变速箱正常化为手动或自动。

我的初始数据是这样的(注意这是补数据)

Make    | Transmission |  Price
BWM     6 Speed Automatic  50000
TOYOTA  5 Speed Automatic  40000
BWM     7 Speed Manual     70000
NISSAN  3 Speed Automatic  50000
TOYOTA  5 Speed Manual     30000

我的目标是将任何包含“自动”的变速箱转换为“自动”,将包含“手动”的变速箱转换为“手动”

我目前的方法是使用 gsub()

df$Transmission <- gsub("6 Speed Automatic", "Automatic", df$Transmission)
df$Transmission <- gsub("5 Speed Automatic", "Automatic", df$Transmission)
df$Transmission <- gsub("3 Speed Automatic", "Automatic", df$Transmission)
df$Transmission <- gsub("7 Speed Manual", "Manual", df$Transmission)
df$Transmission <- gsub("5 Speed Manual", "Manual", df$Transmission)

在实际的数据集中,有许多不同类型的自动和手动变速器。我认为复制粘贴 gsub() 函数效率不高。

我正在尝试找到一种使用正则表达式替换的方法,但是我能做的最好的事情是使用 dplyr 过滤器来识别它们

filter(df, grepl("Automatic", Transmission))

无论如何我可以将包含自动的字符串替换为“自动”并将包含手动的字符串替换为“手动”。在我的情况下,使用多个 gsub 根本没有效率。

【问题讨论】:

    标签: r


    【解决方案1】:

    假设:

    1. “自动”和“手动”的拼写完全正确,因此在所有可能的传输值中(即没有拼写错误、大小写不变等);和
    2. 没有同时包含“自动”和“手动”的传输值。

    类似下面的东西应该可以工作:

    df %>%
      mutate(Transmission2 = case_when(
        grepl("Automatic", Transmission) ~ "Automatic",
        grepl("Manual", Transmission) ~ "Manual",
        TRUE ~ ""))
    

    数据:

    df <- read.csv(
      text = "Make, Transmission, Price
      BWM,     6 Speed Automatic,  50000
      TOYOTA,  5 Speed Automatic,  40000
      BWM,     7 Speed Manual,     70000
      NISSAN,  3 Speed Automatic,  50000
      TOYOTA,  5 Speed Manual,     30000"
    )
    

    【讨论】:

      【解决方案2】:

      另一种方式:

      > df <- data.table(Transmission = c('6 Speed Automatic',
                                        '5 Speed Automatic',
                                        '7 Speed Manual',
                                        '3 Speed Automatic',
                                        '5 Speed Manual'))
      
      > df[, Transmission := str_extract(string = Transmission, pattern = 'Automatic|Manual')]
      > df
      
         Transmission
      1:    Automatic
      2:    Automatic
      3:       Manual
      4:    Automatic
      5:       Manual
      

      【讨论】:

        【解决方案3】:

        这是一种快速的 data.table 方式。

        library(data.table)
        
        Make <- c('BWM','TOYOTA','BWM','NISSAN','TOYOTA') 
        Transmission <- c('Speed Automatic','Speed Automatic','Speed Manual','Speed Automatic','Speed Manual')
        
        
        DT <- data.table(Make = Make, Transmission = Transmission)
        
        DT[, Transmission_new := ifelse(Transmission == 'Speed Automatic', 
            'Automatic', 'Manual')]
        
        > DT
             Make    Transmission Transmission_new
        1:    BWM Speed Automatic        Automatic
        2: TOYOTA Speed Automatic        Automatic
        3:    BWM    Speed Manual           Manual
        4: NISSAN Speed Automatic        Automatic
        5: TOYOTA    Speed Manual           Manual
        

        【讨论】:

          猜你喜欢
          • 2019-02-21
          • 2014-12-17
          • 1970-01-01
          • 2020-05-13
          • 1970-01-01
          • 1970-01-01
          • 2014-05-16
          • 2017-03-10
          相关资源
          最近更新 更多