Изменение порядка элементов адреса

У меня есть старая клиентская база данных (.csv) адресов. Самая большая проблема в том, что они несовместимы, и когда я их разделяю, муниципалитет находится либо в области, либо в городе, либо так далее... Пример:

(header) Country, Municipality, City, Detailed address(street name, number, floor, ap.)

**(proper) Count.xxxxxx, Mun.xxxxx, City.xxxx**

(case 1) Count.xxxxxx, City.xxxx, Mun.xxxxx

(case 2) Count.xxxxxx, City.xxxx, -Mun.xxxxx

(case 3) City.xxxx, Count.xxxxxx, Mun.xxxxx

(case 4) Mun.xxxxx, City.xxxx, Count.xxxxxx

(case 5) Mun.xxxxx, Count.xxxxxx, City.xxxx 

«xxxx» = различные имена, содержит также цифры, пробелы и «.

Я попытался переупорядочить их все в следующем формате: Count.,Mun.,City., но все, что я видел и пробовал, было больше похоже на сортировку и фильтрацию.

Мне нужна помощь в изменении порядка, чтобы база данных была согласованной и все данные находились в соответствующем столбце.


более сложные примеры:

Страна, Район, Муниципалитет, Город, Подробный адрес улица/бульвар номер подъезд этаж кв. номер (Детальный адрес как бул. Болгария 100 подъезд А эт.4 кв.256)

Как вы можете себе представить, не все поля заполнены, а иногда поля не разделены "," (но это проблема, с которой мне придется смириться... не могу пройти через 65 тысяч строк...)

Count.xxxxx, Area.xx xxx, Munic.xxxxx, Cit.xxxxx, Addr.xxxxx

Area.xxxxx, Munic.xxxxx, Cit.xxxxx, Addr.xxxxx Munic.xxxxx, Cit.xxxxx,
Addr.xx xxx, Count.xxxxx Count.xxxxx, Munic.xxxxx, Cit.xxxxx, Addr.xxxxx
Munic.xxxxx, Vill.xxxxx Area.xxxxx, Addr.xxxxx Munic.xxxxx, Cit.xxxxx
Cit.xxxxx, Munic.xx xxx, Addr.xxx xx

а другое дело, что это мог быть и Город, и Деревня (ct. vill.)


person Mihail    schedule 12.10.2015    source источник
comment
Не могли бы вы опубликовать вымышленный пример некоторых разных строк базы данных? это даст нам что-то, с чем можно работать :)   -  person Bas    schedule 12.10.2015


Ответы (1)


Похоже, вам просто нужно взять округ, город и муниципалитет из каждой строки. Вы можете сделать это, используя grep для захвата правильных элементов строки:

data.frame(County = apply(dat, 1, grep, pattern="Count\\.", value=TRUE),
           City = apply(dat, 1, grep, pattern="City\\.", value=TRUE),
           Mun = apply(dat, 1, grep, pattern="Mun\\.", value=TRUE))
#     County   City   Mun
# 1  Count.1 City.1 Mun.4
# 2  Count.3 City.2 Mun.7
# 3  Count.2 City.5 Mun.8
# 4  Count.2 City.2 Mun.1
# 5 Count.10 City.2 Mun.6
# 6  Count.1 City.1 Mun.4

Данные:

(dat = data.frame(A=c("Count.1", "Count.3", "City.5", "City.2", "Mun.6", "Mun.4"),
                  B=c("City.1", "Mun.7", "Count.2", "Mun.1", "Count.10", "City.1"),
                  C=c("Mun.4", "City.2", "Mun.8", "Count.2", "City.2", "Count.1"),
                  stringsAsFactors=FALSE))
#         A        B       C
# 1 Count.1   City.1   Mun.4
# 2 Count.3    Mun.7  City.2
# 3  City.5  Count.2   Mun.8
# 4  City.2    Mun.1 Count.2
# 5   Mun.6 Count.10  City.2
# 6   Mun.4   City.1 Count.1
person josliber♦    schedule 12.10.2015
comment
josilber, когда я побежал, я получил следующее: Ошибка в data.frame(символ(0), символ(0), символ(0), символ(0), : аргументы подразумевают разное количество строк: 0, 1 - person Mihail; 13.10.2015
comment
Ошибка исправлена. Пришлось добавить пакет data.table. Вместо (dat = data.frame(...) заменил на (dat = data.table(... и теперь работает как русская ракета - точно!!! :) Спасибо - person Mihail; 13.10.2015