2016-11-10 32 views
2

嘿,我有一个数据集,我手工采摘以下7项为例:如何使用stringr和正则表达式来转换字符串(更改,保留,提取)与一些例外?

mydf <- data.frame(transmission = c('Auto(L3)','Auto(L4)','Auto (S4)','Automatic (6-spd)','Automatic (L3)', 
'Automatic (variable gear ratios)', 'Manual 4-spd')) 

这是

     transmission 
1       Auto(L3) 
2       Auto(L4) 
3      Auto (S4) 
4     Automatic 6-spd 
5     Automatic (L3) 
6 Automatic (variable gear ratios) 
7      Manual 4-spd 

的要求是自动(...)转换为自动.. - 自动(L3)到自动L3,自动(S4)到自动S4 - 除去'(',')',' - '或'',除了手动或自动之后的第一个空白 - -spd)自动6spd。

结果应该yiedl:

     transmission 
1      Automatic L3 
2      Automatic L4 
3      Automatic S4 
4     Automatic 6spd 
5      Automatic L3 
6  Automatic variablegearratios 
7      Manual 4spd 

目前我使用的可能是最笨的办法:

transmission %>% 
    str_replace_all(' \\(',' ') %>% 
    str_replace_all('Auto ','Automatic ') %>% 
    str_replace_all(' ','') %>% 
    str_replace_all('[()-]','') %>% 
    str_replace_all('Automatic','Automatic ') %>% 
    str_replace_all('Manual','Manual ') 

但它是如此不必要的冗余和耗时。 用stringr软件包(str_xxx函数)和正则表达式做正确的方法是什么?

在此先感谢。

回答

2
> mydf 
         transmission 
1       Auto(L3) 
2       Auto(L4) 
3      Auto (S4) 
4    Automatic (6-spd) 
5     Automatic (L3) 
6 Automatic (variable gear ratios) 
7      Manual 4-spd 

> mydf$transmission_r = str_replace(mydf$transmission, "Auto(?:matic)?\\s?\\((.*)\\)", "Automatic \\1") 
> mydf$transmission_r = str_replace_all(mydf$transmission_r, "-", "") 
> mydf$transmission_r = str_replace_all(mydf$transmission_r, "(?<!Automatic|Manual)\\s", "") 
> mydf 
         transmission     transmission_r 
1       Auto(L3)     Automatic L3 
2       Auto(L4)     Automatic L4 
3      Auto (S4)     Automatic S4 
4    Automatic (6-spd)     Automatic 6spd 
5     Automatic (L3)     Automatic L3 
6 Automatic (variable gear ratios) Automatic variablegearratios 
7      Manual 4-spd     Manual 4spd 

说明

开始与“自动”这个词,然后,使用非匹配组(使用?:),指示“马蒂奇”可能存在(使用(matic)?)。接下来,请指出可能存在空格(\\s?)。接下来,转义左括号(\\(),捕获匹配组((.*))中的所有文本,最后转义右括号(\\()。这是我们的正则表达式。然后,我们用“自动”一词替换它,然后是我们的第一个匹配组(\\1)中捕获的任何内容,这是括号内的任何内容。

删除连字符现在只是使用str_replace_all删除连字符,并删除除“手动”或“自动”之间的所有空间只是我们使用负面看后面,以确保该空间之前没有这些字(使用(?<!Automatic|Manual))。

1

用少一点的正则表达式,多一些strsplit

mydf$transmission <- gsub("Auto(?=[^m])", "Automatic", mydf$transmission, perl=TRUE) 
sapply(
    strsplit(gsub("[()-]", " ", mydf$transmission), "\\s+"), 
    function(x) paste(x[1], paste0(x[-1],collapse="")) 
) 
#[1] "Automatic L3"     "Automatic L4"     
#[3] "Automatic S4"     "Automatic 6spd"    
#[5] "Automatic L3"     "Automatic variablegearratios" 
#[7] "Manual 4spd" 
相关问题