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

> head(kdata) ID cluster code longt latit 1 410001 2 1003035 -87.7316 41.73827 2 410002 3 1001655 -87.6274 41.80555 3 410007 3 1002658 -87.6321 41.68163 4 410030 3 1001218 -87.7181 41.89198 5 410033 3 1002393 -87.9277 43.02118 6 410037 3 1001039 -87.9560 43.12313

У меня есть еще один фрейм данных, который выглядит так:

> head(gdata) code Month Year MonthKpi.3.1 MonthKpi.4 MonthKpi.7 MonthKpi.8 MonthKpi.9 7959973 1001218 1 2010 -4721.50943 -0.743661905 0.06113550 0.15366151 0.2892823 5256388 1001039 1 2010 -1180.66667 -0.081875509 0.06277033 0.09753102 0.3749104 19304425 1001978 1 2010 -67.46296 -0.006731238 0.01908687 0.06382502 0.6990651 592175 1000107 1 2010 458.61538 0.019967915 0.11607883 0.13124782 0.3024831 32464177 1002863 1 2010 -4037.80000 -0.492330578 0.02269961 0.10713102 0.3161038 18160046 1001900 1 2010 -3232.09091 -0.499757020 0.07833606 0.11517690 0.3062926

Фрейм данных «gdata» содержит те же коды (как в kdata), но повторяется более одного раза (некоторые из них повторяются 36 раз, некоторые 35 и т. Д.). Я хочу создать новый столбец в gdata, содержащий соответствующий кластер, извлеченный из kdata. Обратите внимание, что размеры gdata и kdata не равны, как я уже упоминал, все коды в gdata находятся в kdata, но они повторяются много раз, чтобы размер gdata был намного больше, чем kdata.

Итак, желаемый результат будет:

> head(gdata)

      `code   Month Year MonthKpi.3.1   MonthKpi.4 MonthKpi.7 MonthKpi.8 MonthKpi.9 cluster`

7959973 1001218 1 2010 -4721.50943 -0.743661905 0.06113550 0.15366151 0.2892823 2 5256388 1001039 1 2010 -1180.66667 -0.081875509 0.06277033 0.09753102 0.3749104 3 19304425 1001978 1 2010 -67.46296 -0.006731238 0.01908687 0.06382502 0.6990651 2 592175 1000107 1 2010 458.61538 0.019967915 0.11607883 0.13124782 0.3024831 1 32464177 1002863 1 2010 -4037.80000 -0.492330578 0.02269961 0.10713102 0.3161038 1 18160046 1001900 1 2010 -3232.09091 -0.499757020 0.07833606 0.11517690 0.3062926 1

Позвольте мне добавить тот факт, что я хотел бы сохранить последовательность моих наблюдений в gdata после добавления столбца «кластер» (т.е. я не хочу иметь похожие коды Чтобы быть рядом друг с другом. Спасибо

0
H_A 15 Авг 2014 в 18:04
1
Похоже, вы хотите правильно присоединиться. Это легко сделать с помощью соединения (kdata, qdata, by = "code", type = "right) из пакета plyr
 – 
won782
15 Авг 2014 в 18:12
Спасибо, это работает, но это испортило последовательность данных в 'gdata', чего я не хочу, чтобы это произошло. Есть ли способ сохранить последовательность данных во фрейме данных gdata?
 – 
H_A
15 Авг 2014 в 18:28
1
Если gdata - это фрейм данных (скорее всего), отсортируйте по имени строки (gdata). Исходные имена строк будут сохранены.
 – 
won782
15 Авг 2014 в 18:33
Спасибо, полезная функция
 – 
H_A
15 Авг 2014 в 19:05

1 ответ

Лучший ответ

Вы можете использовать функцию merge:

merge(gdata, kdata[c("cluster", "code")], by = "code", sort = FALSE)

Результат:

     code Month Year MonthKpi.3.1  MonthKpi.4 MonthKpi.7 MonthKpi.8
1 1001218     1 2010    -4721.509 -0.74366190 0.06113550 0.15366151
2 1001039     1 2010    -1180.667 -0.08187551 0.06277033 0.09753102
  MonthKpi.9 cluster
1  0.2892823       3
2  0.3749104       3

Примечание. В вашем примере не все коды kdata присутствуют в gdata. С вашими фактическими данными итоговый фрейм данных будет иметь такое же количество строк, как gdata.

0
Sven Hohenstein 15 Авг 2014 в 18:33
Спасибо, но это решение также не сохраняет последовательность gdata (как в случае с ответом won872). В вашем коде все похожие коды помещаются рядом друг с другом в порядке возрастания. Есть ли способ предотвратить это?
 – 
H_A
15 Авг 2014 в 18:31
Вы должны использовать sort = FALSE. Смотрите обновление моего ответа.
 – 
Sven Hohenstein
15 Авг 2014 в 18:33
Спасибо, я только что читал и обнаружил, что функция слияния не может сохранить порядок (sort= F) только не «сортирует» элементы, она не сохраняет порядок. Я нашел решение в Интернете на этом веб-сайте: r-statistics.com/2012/01/…
 – 
H_A
15 Авг 2014 в 19:04