过滤替换包含给定模式的字符串

时间:2018-02-26 02:25:38

标签: r

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

我必须将汽车的传输标准化为手动或自动。

我的初始数据看起来像这样(注意这是化妆数据)

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

我的目标是将包含自动的任何传输转换为"自动"以及包含Manual to" Manual"

的传输

我目前的做法是使用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)

在真正的daaset中,有许多不同类型的自动和手动传输。我不认为复制粘贴gsub()函数是有效的。

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

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

无论如何,我可以将包含Automatic的字符串替换为&#34; Automatic&#34;和包含手册的字符串&#34;手册&#34;。在我的情况下,使用多个gsub完全没有效率。

3 个答案:

答案 0 :(得分:1)

这是一种快速的数据表。

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

答案 1 :(得分:1)

假设:

  1. “自动”的拼写&amp; “手动”完全所以在所有可能的传输值中(即没有拼写错误,大写/小写没有变化等);和
  2. 没有包含“自动”和“自动”的传输值。 “手动”。
  3. 以下内容应该有效:

    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 :(得分:1)

另一种方式:

> 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