Разделение столбца с полным адресом на несколько столбцов - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть кадр данных со следующей структурой столбца (всего более 1000+ строк):

addressfull
POINT(3.124537653 32.179354012)||DEF_32||molengraaf 20, 1689 GL Utrecht, Netherlands||15||map
POINT(3.124537680 32.179354014)||DEF_32||winkellaan 67, 5788 BG Amsterdam, Netherlands||13||map
POINT(3.124537653 32.179354012)||DEF_32||vermeerstraat 18, 0932 DC Rotterdam, Netherlands||11||map
POINT(2.915206183 24.315583523)||DEF_32||--||13||map
POINT (2.900824999999923 34.3175721)||DEF_84||Zandhorstlaan 122, 0823 GT Ochtrup, Germany||17||map
structure(list(addressfull = structure(c(3L, 5L, 4L, 2L, 1L), .Label = c("POINT (2.900824999999923 34.3175721)||DEF_84||Zandhorstlaan 122, 0823 GT Ochtrup, Germany||17||map", 
"POINT(2.915206183 24.315583523)||DEF_32||--||13||map", "POINT(3.124537653 32.179354012)||DEF_32||molengraaf 20, 1689 GL Utrecht, Netherlands||15||map", 
"POINT(3.124537653 32.179354012)||DEF_32||vermeerstraat 18, 0932 DC Rotterdam, Netherlands||11||map", 
"POINT(3.124537680 32.179354014)||DEF_32||winkellaan 67, 5788 BG Amsterdam, Netherlands||13||map"
), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))

Столбец содержит местоположение, улицу, домашний номер, почтовый индекс, город и страну. Я хочу разделить столбец addressfull с помощью R на несколько столбцов, например:

street        house number      zip       city      country
molengraaf    20                1689 GL   Utrecht   Netherlands
winkellaan    67                5788 BG   Amsterdam Netherlands
vermeerstraat 18                0932 DC   Rotterdam Netherlands
na            na                na        na        na
Zandhorstlaan 122               0823 GT   Ochtrup   Germany

Я прочитал документацию по тидиру и строковому формату. Я могу видеть шаблон для разделения (по ")", "| из позиции x" и ",". но я не могу понять правильный код для разделения столбца на несколько столбцов.

Может кто-нибудь мне помочь?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Вы можете перебором, используя sub для базового подхода R:

df$steet <- sub("^(\\S+)\\s+.*$", "\\1", df$adressfull)
df$`house number` <- sub("^\\S+\\s+(\\d+).*$", "\\1", df$adressfull)
df$zip <- sub("^\\S+\\s+\\d+,\\s*(\\d+\\s+[A-Z]+).*$", "\\1", df$adressfull)
df$city <- sub("^.*?(\\S+),\\s*\\S+$", "\\1", df$adressfull)
df$country <- sub("^.*,\\s*(\\S+)$", "\\1", df$adressfull)
df

                                   adressfull      steet house number     zip
1 molengraaf 20, 1689 GL Utrecht, Netherlands molengraaf           20 1689 GL
     city     country
1 Utrecht Netherlands

Данные:

df <- data.frame(adressfull=c("molengraaf 20, 1689 GL Utrecht, Netherlands"),
                 stringsAsFactors=FALSE)

Это предполагает, что мы уже выделен только текст адреса. Для этого conisder:

text <- "POINT(3.124537653 32.179354012)||DEF_32||molengraaf 20, 1689 GL Utrecht, Netherlands||15||map"
addresfull <- unlist(strsplit(text, "\\|\\|"))[3]
addresfull

[1] "molengraaf 20, 1689 GL Utrecht, Netherlands"
0 голосов
/ 27 февраля 2020

A stringr решение таково:

addresssplit <- data.frame(
  street = str_extract(addressfull$addressfull, "(?<=DEF_\\d{2}\\|\\|)\\w+\\b"),
  number = str_extract(addressfull$addressfull, "\\d{1,}(?=,)"),
  zip = str_extract(addressfull$addressfull, "(?<=\\s)\\d{4}\\s[A-Z]{2}"),
  city = str_extract(addressfull$addressfull, "(?<=\\d{4}\\s[A-Z]{2}\\s)\\w+"),
  country = str_extract(addressfull$addressfull, "(?<=[a-z]\\b,\\s)\\w+\\b")
)

РЕЗУЛЬТАТ:

addresssplit
         street number     zip      city     country
1    molengraaf     20 1689 GL   Utrecht Netherlands
2    winkellaan     67 5788 BG Amsterdam Netherlands
3 vermeerstraat     18 0932 DC Rotterdam Netherlands
4          <NA>   <NA>    <NA>      <NA>        <NA>
5 Zandhorstlaan    122 0823 GT   Ochtrup     Germany

ДАННЫЕ:

addressfull <- structure(list(addressfull = structure(c(3L, 5L, 4L, 2L, 1L), .Label = c("POINT (2.900824999999923 34.3175721)||DEF_84||Zandhorstlaan 122, 0823 GT Ochtrup, Germany||17||map", 
                                                                                    "POINT(2.915206183 24.315583523)||DEF_32||--||13||map", "POINT(3.124537653 32.179354012)||DEF_32||molengraaf 20, 1689 GL Utrecht, Netherlands||15||map", 
                                                                                    "POINT(3.124537653 32.179354012)||DEF_32||vermeerstraat 18, 0932 DC Rotterdam, Netherlands||11||map", 
                                                                                    "POINT(3.124537680 32.179354014)||DEF_32||winkellaan 67, 5788 BG Amsterdam, Netherlands||13||map"
), class = "factor")), class = "data.frame", row.names = c(NA, 
                                                           -5L))
0 голосов
/ 27 февраля 2020

Это будет двусторонний подход к проблеме:

library(tidyverse)
df <- structure(list(addressfull = structure(c(3L, 5L, 4L, 2L, 1L), .Label = c("POINT (2.900824999999923 34.3175721)||DEF_84||Zandhorstlaan 122, 0823 GT Ochtrup, Germany||17||map", 
                                                                               "POINT(2.915206183 24.315583523)||DEF_32||--||13||map", "POINT(3.124537653 32.179354012)||DEF_32||molengraaf 20, 1689 GL Utrecht, Netherlands||15||map", 
                                                                               "POINT(3.124537653 32.179354012)||DEF_32||vermeerstraat 18, 0932 DC Rotterdam, Netherlands||11||map", 
                                                                               "POINT(3.124537680 32.179354014)||DEF_32||winkellaan 67, 5788 BG Amsterdam, Netherlands||13||map"
), class = "factor")), class = "data.frame", row.names = c(NA, 
                                                           -5L))



df %>% separate(addressfull, sep = "\\|\\|", into = c("Coords", "DEF", "ADDRESS"),extra = "drop") %>% 
  select(ADDRESS) %>% 
  separate(ADDRESS, sep = ",", into = c("street", "city", "country")) %>% 
  separate(street, sep = "(?= \\d)", into = c("street", "house_number")) %>% 
  separate(city, sep = "(?<=[A-Z][A-Z])", into = c("zip", "city"))
#> Warning: Expected 3 pieces. Missing pieces filled with `NA` in 1 rows [4].
#> Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [4].
#>          street house_number      zip       city      country
#> 1    molengraaf           20  1689 GL    Utrecht  Netherlands
#> 2    winkellaan           67  5788 BG  Amsterdam  Netherlands
#> 3 vermeerstraat           18  0932 DC  Rotterdam  Netherlands
#> 4            --         <NA>     <NA>       <NA>         <NA>
#> 5 Zandhorstlaan          122  0823 GT    Ochtrup      Germany

Создано в 2020-02-27 с помощью пакета представительства (v0.3.0)

...