简体   繁体   中英

Removing Custom Words From Text Variables in R

I have Data set which looks like following:

dat <- data.frame(ID=c(1,2,3,4,5),ADDRESS=c("EAST SS BLVD","SOUTH AA STREET","XX EAST ST","ZZ NORTH ROAD","WEST TR TRAIL"))

> dat
  ID         ADDRESS
1  1    EAST SS BLVD
2  2 SOUTH AA STREET
3  3      XX EAST ST
4  4   ZZ NORTH ROAD
5  5   WEST TR TRAIL

I want to remove all details in address not in list of words I want. I am using following code which is not proper and is not working.

 dat$FEATURE <- gsub("^[(BLVD)|(BOULEVARD)|(DRIVE)|(DR)|(ROAD)|(RD)|(PL)|(PLACE)
                |(SL)|(CIRCLE)|(CT)|(COURT)|(WY)|(WAY)|(ST)|(STREET)|(AVE)
                |(AVENUE)|(PKWY)|(WAY)|(PARKWAY)|(LN)|(LANE)|(HWY)|(HIGHWAY)
                |(TRAIL$)|(CIR$)]","",dat$ADDRESS)

> dat
  ID         ADDRESS        FEATURE
1  1    EAST SS BLVD    AST SS BLVD
2  2 SOUTH AA STREET OUTH AA STREET
3  3      XX EAST ST     XX EAST ST
4  4   ZZ NORTH ROAD  ZZ NORTH ROAD
5  5   WEST TR TRAIL   EST TR TRAIL

Output that I want is :

> dat1
  ID         ADDRESS FEATURE
1  1    EAST SS BLVD    BLVD
2  2 SOUTH AA STREET  STREET
3  3      XX EAST ST      ST
4  4   ZZ NORTH ROAD    ROAD
5  5   WEST TR TRAIL   TRAIL

I am not great regex any help is appreciated and any references for regex in R will be helpful.

You may use

(?xs).*\b        # any 0+ chars, as many as possible, then word boundary
 (               # Group 1 start:
   BLVD|BOULEVARD|DR(?:IVE)?|R(?:OA)?D|PL(?:ACE)?      # Various words
   |SL|CIRCLE|CT|COURT|WA?Y|ST(?:REET)?|AVE(?:NUE)?    # you need to keep
   |PKWY|(PARK)?:WAY|LN|LANE|HWY|HIGHWAY               # here
   |TRAIL$|CIR$                                        # and here
 )               # Group 1 end
 \b              # Word boundary
 .*              # Rest of the string.

See the regex demo

Here, (?x) is a free spacing/comment/verbose modifier enabling formatting whitespace inside the pattern and comments inside. (?s) is a DOTALL modifier allowing . match any char including a newline (it is necessary as it is a PCRE pattern, pay attention to perl=TRUE ).

The "\\\\1" replacement inserts the value in Group 1 back into the replaced string.

See the R demo :

dat <- data.frame(ID=c(1,2,3,4,5),ADDRESS=c("EAST SS BLVD","SOUTH AA STREET","XX EAST ST","ZZ NORTH ROAD","WEST TR TRAIL"))
dat$FEATURE <- gsub("(?xs).*\\b(BLVD|BOULEVARD|DR(?:IVE)?|R(?:OA)?D|PL(?:ACE)?
                |SL|CIRCLE|CT|COURT|WA?Y|ST(?:REET)?|AVE(?:NUE)?
                |PKWY|(PARK)?:WAY|LN|LANE|HWY|HIGHWAY
                |TRAIL$|CIR$)\\b.*","\\1",dat$ADDRESS, perl=TRUE)
dat

Output:

  ID         ADDRESS FEATURE
1  1    EAST SS BLVD    BLVD
2  2 SOUTH AA STREET  STREET
3  3      XX EAST ST      ST
4  4   ZZ NORTH ROAD    ROAD
5  5   WEST TR TRAIL   TRAIL

You could do it like this

#R version 3.3.2 

dat <- data.frame(ID=c(1,2,3,4,5),ADDRESS=c("EAST SS BLVD","SOUTH AA STREET","XX EAST ST","ZZ NORTH ROAD","WEST TR TRAIL"))
dat$FEATURE <- gsub("\\b(?!AVE(?:NUE)?|B(?:LV|OULEVAR)D|C(?:IR(?:CLE)?|OURT|T)|DR(?:IVE)?|H(?:IGHWA|W)Y|L(?:ANE|N)|P(?:ARKWAY|KWY|L(?:ACE)?)|R(?:|OA)D|S(?:L|T(?:REET)?)|TRAIL|W(?:AY|Y)).+?\\b","",dat$ADDRESS, perl=TRUE)
dat

http://rextester.com/GGYN78288

https://regex101.com/r/6RcXTi/1


I guess technically, this is more exact:

"\\\\b(?!(?:AVE(?:NUE)?|B(?:LV|OULEVAR)D|C(?:IR(?:CLE)?|OURT|T)|DR(?:IVE)?|H(?:IGHWA|W)Y|L(?:ANE|N)|P(?:ARKWAY|KWY|L(?:ACE)?)|R(?:|OA)D|S(?:L|T(?:REET)?)|TRAIL|W(?:AY|Y))\\\\b).+?\\\\b"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM