Почему слияние с обновлением не работает как задумано? - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь обновить некоторые отсутствующие значения в наборе данных значениями из другого.

Вот пример в Stata 14.2:

sysuse auto, clear   

// save in order to merge below
save auto, replace 

// create some missing to update
replace length = . if length < 175

// just so the two datasets are not exactly the same, which is my real example
drop if _n == _N

merge 1:1 make using auto, nogen keep(master match_update) update

Код выше сохраняет тольконаблюдения обновлены (26 наблюдения).Это точно такой же результат, если вместо этого использовать keep(match_update).

Почему Stata не сохраняет все наблюдения в наборе основных данных?

Обратите внимание, что использование match_update также не полезно, так как удаляет все наблюдения.

Мой текущий обходной путь - переименовать исходные переменные, объединить все, а затем заменить, если оригинал отсутствовал.Однако это лишает смысла использование опции update и затрудняет обновление многих переменных.

1 Ответ

4 голосов
/ 12 апреля 2019

Лично я всегда предпочитаю вручную drop / keep наблюдения, используя переменную _merge, так как она более прозрачна и менее подвержена ошибкам.

Однако следующее делает то, что вы хотите:

merge 1:1 make using auto, nogenerate keep(master match match_update) update

Result                           # of obs.
-----------------------------------------
not matched                             0

matched                                73
    not updated                        47  
    missing updated                    26  
    nonmissing conflict                 0  
-----------------------------------------

Вы можете подтвердить это следующим образом:

sysuse auto, clear   
save auto, replace

replace length = . if length < 175
drop if _n == _N

merge 1:1 make using auto, update 

drop if _merge == 2
drop _merge
save m1

sysuse auto, clear   
save auto, replace

replace length = . if length < 175 
drop if _n == _N 

merge 1:1 make using auto, nogen keep(master match match_update) update 
save m2

cf _all using m1

display r(Nsum)
0
...