Расщепление колонны с различным синтаксисом в R - PullRequest
0 голосов
/ 27 августа 2018

У меня проблемы с очисткой данных. Он состоит из списка проданных домов. Он состоит из цены продажи, нет. комнат, м2 и адрес. Как видно ниже, адрес находится в одной строке.

Head(DF, 3)

Address                            Price        m2        Rooms   
Petersvej   1772900  Hoersholm     10.000       210       5        
Annasvej    2B2900   Hoersholm     15.000       230       4        
Krænsvej    125800   Lyngby C      10.000       210       5               
A Mivs Alle 119800   Hjoerring      1.300        70       3        

Синтаксис для адресной колонки: название дороги, номер дороги, за которым следуют 4-значный почтовый индекс и название города (иногда два слова).

Также нужно извлечь почтовый индекс .. я искал пакет 'stringi', не смог найти ни одного примера ..

очень ценятся любые указатели

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Проверьте функцию cSplit из пакета splitstackshape

library(splitstackshape)
df_new <- cSplit(df, splitCols = "Address", sep = " ")
#This will split your address column into 4 different columns split at the space

#you can then add an ifelse block to combine the last 2 columns to make up the city like
df_new$City <- ifelse(is.na(df_new$Address_4), as.character(df_new$Address_3), paste(df_new$Address_3, df_new$Address_4, sep = " "))
0 голосов
/ 27 августа 2018

Один из способов сделать это - regex .

В этом случае вы можете использовать простое регулярное выражение, которое будет соответствовать всем буквам алфавита и пробелам, которые ведут к концу строки, а затем обрезать пробелы.

    library(stringr)

    DF <- data.frame(Address=c("Petersvej 772900  Hoersholm",
      "Annasvej 121B2900 Hoersholm",
      "Krænsvej 125800   Lyngby C"))
    DF$CITY <- str_trim(str_extract(DF$Address, "[a-zA-Z ]+$"))

Это даст вам следующий вывод:

                          Address      CITY
    1 Petersvej 772900  Hoersholm Hoersholm
    2 Annasvej 121B2900 Hoersholm Hoersholm
    3  Krænsvej 125800   Lyngby C  Lyngby C

В R пакет stringr предпочтителен для регулярных выражений, поскольку он позволяет захват нескольких групп, что в этом примере может позволить вам отделить каждый компонент адреса одним выражением.

0 голосов
/ 27 августа 2018

1) Используя separate в tidyr, разделите подполя Address на 3 поля, объединяя все, что осталось в последнем, и затем снова используйте separate, чтобы отделить последние 4 цифры в Number столбец, сгенерированный в первом separate.

library(dplyr)
library(tidyr)

DF %>% 
  separate(Address, into = c("Road", "Number", "City"), extra = "merge") %>%
  separate(Number, into = c("StreetNo", "Postal"), sep = -4)

дает:

       Road StreetNo Postal      City Price  m2 Rooms      CITY
1 Petersvej       77   2900 Hoersholm    10 210     5 Hoersholm
2  Annasvej     121B   2900 Hoersholm    15 230     4 Hoersholm
3  Krænsvej       12   5800  Lyngby C    10 210     5         C

2) В качестве альтернативы вставьте запятые между подполями Address, а затем используйте separate для разделения подполей. Он дает тот же результат, что и (1) на входе, показанном в примечании ниже.

DF %>% 
  mutate(Address = sub("(\\S.*) +(\\S+)(\\d{4}) +(.*)", "\\1,\\2,\\3,\\4", Address)) %>%
  separate(Address, into = c("Road", "Number", "Postal", "City"), sep = ",")

Примечание

Ввод DF в воспроизводимом виде:

DF <- 
structure(list(Address = structure(c(3L, 1L, 2L), .Label = c("Annasvej 121B2900 Hoersholm", 
"Krænsvej 125800   Lyngby C", "Petersvej 772900  Hoersholm"), class = "factor"), 
    Price = c(10, 15, 10), m2 = c(210L, 230L, 210L), Rooms = c(5L, 
    4L, 5L), CITY = structure(c(2L, 2L, 1L), .Label = c("C", 
    "Hoersholm"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

Обновление

Добавлено и исправлено (2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...