Подсчет имени и фамилии, появляющихся более одного раза - PullRequest
1 голос
/ 25 мая 2019

У меня есть следующие имена:

clear
input str25 names
"Trenton Mercer"
"Carissa Moyer"
"Timothy Delgado"
"Kaylynn Payne"
"Harry Patton"
"Charlie Dudley"
"Harry Schmitt"
"Wyatt Hammond"
"Kasen Delgado"
"Katherine Noble"
"Julius Jarvis"
"Harry Carney"
"Wyatt Holden"
"Megan Wilson"
"Priscilla Shaffer"
"Savanah Marshall"
"Harry Delgado"
"Harper Ballard"
"Harry Mcmahon"
"Alejandro Jarvis"
end

Как определить, какие имена и фамилии (отдельно) встречаются более одного раза?

Я также хотел бы посчитать, сколькораз они появляются.

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

Решение Пирли (с 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 частей, то есть имени и фамилии, поэтому не включает отчества (ей).

  • Вы просто хотите сравнить внутри каждой группы (каждое имя среди имен, фамилию среди фамилий), не сравнивая ни одного с теми из другой группы.

2 голосов
/ 25 мая 2019

Один из способов сделать это заключается в следующем:

split names, generate(a)
generate tag = 1

forvalues i = 1 / 2 {
    egen b`i' = group(a`i')
    bysort b`i': replace tag = sum(tag)
    bysort b`i': generate c`i' = a`i' if _n == _N & tag > 1
    bysort b`i': generate d`i' = tag  if _n == _N & tag > 1

    list c`i' d`i' if !missing(d`i'), noobs
    replace tag = 1
}

  +------------+
  |    c1   d1 |
  |------------|
  | Harry    5 |
  | Wyatt    2 |
  +------------+

  +--------------+
  |      c2   d2 |
  |--------------|
  | Delgado    3 |
  |  Jarvis    2 |
  +--------------+
...