Решение Пирли (с split
как определенно лучший выбор для этой проблемы) кажется разумным. Но есть еще некоторые ненужные контуры. Например, генерация переменных tag, b1, b2 кажется не очень необходимой.
И что еще более важно, окончательный результат не является полностью согласованным, поскольку информация о подсчете соответствует случайному порядку, который также отличается от исходного без четкого объяснения.
Таким образом, я пытаюсь предложить решение (которое также должно иметь дефекты), просто чтобы избежать этих проблем, и в то же время предоставить результат, который вы ищете.
split names
foreach v in `r(varlist)' {
egen TotalAppear_`v' = total(`v' != ""), by(`v')
egen LastAppear_`v' = max(_n), by(`v')
replace LastAppear_`v' = LastAppear_`v'==_n
list `v' TotalAppear_`v' if LastAppear_`v' == 1 & TotalAppear_`v' >1
}
Следует отметить, что ваше описание приводит к предположениям, сделанным в моем коде, а также в решении Пирли:
Каждое имя состоит только из 2 частей, то есть имени и фамилии, поэтому не включает отчества (ей).
Вы просто хотите сравнить внутри каждой группы (каждое имя среди имен, фамилию среди фамилий), не сравнивая ни одного с теми из другой группы.