Строки потеряны во время слияния в R - PullRequest
1 голос
/ 08 июля 2020

Я работаю с df1, который содержит 180K строк и 27 факторов. Я использовал 3 фактора в слиянии с df2 (43K obs, 10 факторов, 3 фактора совпадают с df1). В df1 строки представляют собой наблюдения, повторяющиеся в течение нескольких месяцев в течение нескольких лет для TrapLines и TrapNum. С TrapLines и TrapNum связано 3393 уникальных уровня. В df2, Shade меняется в зависимости от месяца для TrapLine и Trapnum: для каждой записи TrapLine / Trapnum существует 12 значений Shade. В df2 есть 3268 уникальных уровней, связанных с Trapline / Trapnum. Я хочу объединить (если это правильный процесс) df1 и df2 так, чтобы ежемесячные данные Shade были связаны с правильными Trapline / TrapNum в df1.

df1 :

TrapLine    TrapNum Date        Month_num
A24         D101    1-1-2018       1
A24         D101    2-13-2017      2
A24         D102    3-30-2017      3
A24         D102    4-10-2019      4
A24         D103    4-10-2019      4
A24         D103    5-15-2016      6

et c.

df2:

TrapLine    TrapNum Shade      Month    Month_num
A24         D101    217         Jan      1
A24         D101    201         Feb      2
A24         D101    172         Mar      3
A24         D102    145         Mar      3
A24         D102    97          Apr      4
A24         D102    59          May      5

et c.

Я использовал следующий код:

df3 <- merge (df1, df2, by c("TrapLine", "TrapNum", "Month_num"))

Однако в процессе я теряю 40К наблюдений из df1! Я не могу объяснить, что произошло: я бы подумал, что если бы не было совпадений между TrapLine / TrapNum, значения Shade были бы установлены на NA или тому подобное, не то, чтобы наблюдения были потеряны совсем. Может ли кто-нибудь помочь мне понять, что произошло, и какой процесс можно использовать, чтобы я сохранил все наблюдения (позже я побеспокоюсь об удалении наблюдений без Shade!). Спасибо за ваше время и внимание. Ура, Дуг

1 Ответ

1 голос
/ 08 июля 2020

Используйте аргумент all функции merge. По умолчанию all=FALSE, поэтому выполняется «внутреннее соединение» и отбрасываются все несогласованные наблюдения. Если вы установите merge(..., all=TRUE), вы получите «внешнее соединение» и сохраните все наблюдения. См. https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/merge

...