Объединение фрейма данных и таблицы поиска в r с сохранением всех записей из фрейма данных

Имею фрейм данных 59720 набл. как показано ниже. Я хочу присвоить ИМЯ РЫНКА каждому наблюдению из таблицы поиска.

> data (a)

     DAY  HOUR LEAD Row.Count     DATE    ITIME  HOMEPHONE            CITY  STATE ZIPCODE     ZONENAME
1 Monday 13:00    1      9430 7/1/2013 13:42:51            FORT LAUDERDALE     FL  33315       68
2 Monday 13:00    1      9432 7/1/2013 13:43:50 xxxxx9802x  PLEASANT GROVE     AL  35127       82
3 Monday 13:00    1      9434 7/1/2013 13:46:18 5xxxx85x10      ORO VALLEY     AZ  85737       54
4 Monday  0:00    1      9435 7/1/2013  0:04:34 50xxxx1x364          SPOKANE    WA  99204      211
5 Monday 11:00    1      9436 7/1/2013 11:45:43 951xxxxx20        RIVERSIDE    CA  92507       31
6 Monday 11:00    1      9437 7/1/2013 11:46:26 760xxxxx679            VISTA    CA  92081      539

У меня есть таблица поиска почтовых индексов с 43126 уникальными почтовыми индексами, которая выглядит так:

> data (b)

MARKETNAME            ZIPCODE
NEW YORK              00501
NEW YORK              00544
SPRINGFIELD-HOLYOKE   01001
SPRINGFIELD-HOLYOKE   01002
SPRINGFIELD-HOLYOKE   01003
SPRINGFIELD-HOLYOKE   01004

Я хотел просто присвоить ИМЯ РЫНКА моему набору данных "a", сравнивая ZIPCODE в "b". Так что я использовал

> c <- merge(a, b, by="ZIPCODE") .

Было получено 58 972 наблюдений. что означало, что я потерял 748 набл. Я не хотел терять записи из a, поэтому изменил свой код следующим образом:

> c <- merge (a, b, by = "ZIPCODE" , all.x=TRUE) .

Как ни странно, это вернуло 61 652 набл. вместо моего ожидания, которое возвращало 59 720 наблюдений. в соответствии с исходным a фреймом данных с некоторыми НА.

Согласно документации,

"если ИСТИНА, то к выходным данным будут добавлены дополнительные строки, по одной для каждой строки в x, не имеющей соответствующей строки в y. Эти строки будут иметь NA в тех столбцах, которые обычно заполнены значениями из y. Значение по умолчанию - FALSE, так что в вывод включаются только строки с данными как от x, так и от y ".

Моя интерпретация этого совершенно неверна. Может кто-нибудь объяснить, что я делаю не так и как я могу выполнить эту простую задачу?

Я сослался на: Как объединить фреймы данных и изменить значения элементов в зависимости от определенных условий?, Подмножество и объединение двух связанных фреймов данных в r, как объединить два фрейма данных неравного размера в R, но ни один из них не похож на мою проблему.


person vagabond    schedule 31.07.2014    source источник
comment
Одна возможность: у вас могут быть повторяющиеся ключи в наборе данных b. Отметьте nrow(b) == length(unique(b$ZIPCODE)). Если у вас есть nrow(b) > length(unique(b$ZIPCODE)), то для каждой совпадающей пары ключей вы добавите несколько строк в ваш объединенный набор данных.   -  person ialm    schedule 01.08.2014
comment
Ваши почтовые индексы в data (a) (какими бы они ни были, поскольку это не R-код) содержат ведущие и обучающие пробелы.   -  person IRTFM    schedule 01.08.2014
comment
Я отредактирую q с помощью dput, но я очистил пробелы перед его чтением.   -  person vagabond    schedule 01.08.2014
comment
Вы также можете указать strip.white = TRUE при чтении данных с помощью read.table.   -  person talat    schedule 01.08.2014
comment
Связано: http://stackoverflow.com/questions/8433523/creating-a-new-variable-from-a-lookup-table   -  person landroni    schedule 01.08.2014
comment
@ialm нет. Об этом позаботились. Все это уникально.   -  person vagabond    schedule 01.08.2014
comment
@ialm ты был прав! Я повторил ключи. Два торговых названия имеют один и тот же почтовый индекс. Вот только моя проблема теперь стала более сложной. Мне нужно использовать другие ключи. Кроме того, у моего объединенного фрейма данных две проблемы: (1) В DMANAMES есть значения NA, которые не были сопоставлены. (2) В моем объединенном фрейме данных есть дубликаты - две записи с разными ИМЕНАМИ DMA, но на самом деле это одно и то же наблюдение. Этот пост был полезен. stackoverflow.com/ вопросы / 11369961 /   -  person vagabond    schedule 01.08.2014


Ответы (1)


Я предпочитаю join из plyr, которое по умолчанию является левым соединением, возвращающим все совпадения записей в первом фрейме данных.

c <- join(a, b, by="ZIPCODE")

person Ricky    schedule 01.08.2014
comment
Спасибо, Рики, это хорошая идея. Хотя @ialm был прав. У меня есть повторяющиеся ключи в наборе данных b - person vagabond; 01.08.2014