代码之家  ›  专栏  ›  技术社区  ›  akash87

Regex,根据标点符号R分开?

  •  -2
  • akash87  · 技术社区  · 6 年前

    我知道这是一个 regex 问题,可能已经被回答了,但我无法找出这个问题的答案。我有5000个地址的数据集,其中一些地址显示为:

    199 REEDSDALE ROAD MILTON, MA (42.252352, -71.075213)
    2014 WASHINGTON STREET NEWTON, MA (42.332339, -71.246592)
    75 FRANCIS STREET BOSTON, MA (42.335954, -71.107661)
    235 NORTH PEARL STREET BROCKTON, MA (42.09707, -71.065645)
    41 HIGHLAND AVENUE WINCHESTER, MA (42.465496, -71.121408)
    

    第一个逗号是地址城市与州之间的分隔,还有纬度和经度坐标。我有兴趣把坐标分成两列,纬度和经度

    lat        lon
    42.252352  -71.075213
    42.332339  -71.246592
    42.335954  -71.107661
    42.09707   -71.065645
    42.465496  -71.121408
    

    感谢您的一切帮助!

    1 回复  |  直到 6 年前
        1
  •  3
  •   akrun    6 年前

    其中一个选项是使用regex lookaround提取数值部分

    library(tidyverse)
    data_frame(lat = str_extract(lines, "(?<=\\()-?[0-9.]+"), 
               lon = str_extract(lines, "-?[0-9.]+(?=\\))"))
    # A tibble: 5 x 2
    #  lat       lon       
    #  <chr>     <chr>     
    #1 42.252352 -71.075213
    #2 42.332339 -71.246592
    #3 42.335954 -71.107661
    #4 42.09707  -71.065645
    #5 42.465496 -71.121408
    

    或与 read.csv 删除字符后,直到 ( ,包括 ( ) (最后)与 gsub ,使 , 作为 读.csv 分成两列

    read.csv(text = gsub("^[^(]+\\(|\\)$", "", lines), header=FALSE, 
              col.names = c("lat", "lon"))
    #    lat       lon
    #1 42.25235 -71.07521
    #2 42.33234 -71.24659
    #3 42.33595 -71.10766
    #4 42.09707 -71.06565
    #5 42.46550 -71.12141
    

    数据

    lines <- readLines("file.txt")