Создайте новую переменную, если значение в var1 существует в var2 - PullRequest
0 голосов
/ 10 октября 2018

Предположим, у меня есть переменная list_a со всеми возможными видами спорта в мире:

football 
tennis 
hockey
cricket
croquet
racquetball
cricket
pingpong
squash
rugby
swimming
swimming
soccer 

Также предположим, что у меня есть еще одна переменная list_b только из трех видов спорта:

cricket
hockey
swimming

Я хочу создать новую переменную Cont, которая будет равна 1, когда виды спорта в list_a найдены в list_b, и равна 0, когда вид спорта не находится в list_b.

Вот как будет выглядеть переменная Cont:

0
0
1
1
0
0
1
0
0
0
1 
1
0

Будет ли работать следующее:

gen Cont = 0
replace Cont = 1 if  (strmatch( list_a, ( list_b)))

РЕДАКТИРОВАТЬ:

Предположим, что list_a также содержит hoccckey (что является опечаткой), но я все еще хочу, чтобы его подсчитали.

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Существует простой метод, который отлично работает для вашего игрушечного примера:

clear 
input strL list_a 
football 
tennis 
hockey
cricket
croquet
racquetball
cricket
pingpong
squash
rugby
swimming
swimming
soccer 
end 

gen wanted = inlist(list_a, "cricket", "hockey", "swimming") 

list, sepby(wanted)

     +----------------------+
     |      list_a   wanted |
     |----------------------|
  1. |    football        0 |
  2. |      tennis        0 |
     |----------------------|
  3. |      hockey        1 |
  4. |     cricket        1 |
     |----------------------|
  5. |     croquet        0 |
  6. | racquetball        0 |
     |----------------------|
  7. |     cricket        1 |
     |----------------------|
  8. |    pingpong        0 |
  9. |      squash        0 |
 10. |       rugby        0 |
     |----------------------|
 11. |    swimming        1 |
 12. |    swimming        1 |
     |----------------------|
 13. |      soccer        0 |
     +----------------------+

Если бы у вас было намного больше значений, вы могли бы перебрать искомые значения, используя levelsof, если они находятся ввторой переменной или поместите кандидатов в отдельный набор данных и merge, как описано в в этом FAQ .

Все эти методы зависят от точного равенства строк, поэтому следите за различиями между прописными и строчными буквами, начальными и конечными пробелами и несоответствиями в написании.

0 голосов
/ 10 октября 2018

Ответ отрицательный, поскольку ваш подход будет сравнивать значения двух переменных в каждом наблюдении.Вместо этого вам нужно сравнить значение в каждой строке list_a со всеми значениями переменной list_b.

Используя пример вашей игрушки:

clear

input strL(list_a list_b)
football cricket
tennis hockey 
hockey swimming 
cricket 
croquet 
racquetball 
cricket
pingpong
squash
rugby
swimming 
swimming
soccer
end

Следующее иллюстрирует философию:

local obs = _N
generate Cont = 0

forvalues i = 1 / `obs' {
    forvalues j = 1 / `obs' {
        replace Cont = 1 if list_a[`i'] == list_b[`j'] in `i'
    }
}

list
     +-------------------------------+
     |      list_a     list_b   Cont |
     |-------------------------------|
  1. |    football    cricket      0 |
  2. |      tennis     hockey      0 |
  3. |      hockey   swimming      1 |
  4. |     cricket                 1 |
  5. |     croquet                 0 |
     |-------------------------------|
  6. | racquetball                 0 |
  7. |     cricket                 1 |
  8. |    pingpong                 0 |
  9. |      squash                 0 |
 10. |       rugby                 0 |
     |-------------------------------|
 11. |    swimming                 1 |
 12. |    swimming                 1 |
 13. |      soccer                 0 |
     +-------------------------------+

РЕДАКТИРОВАТЬ:

Если у вас есть определенные опечатки, которые вы дополнительно хотите принять во внимание, вы можете объединитьмое решение с @ NickCox's.В приведенном выше цикле используйте вместо:

replace Cont = 1 if inlist(list_a, "hoccckey") | list_a[`i'] == list_b[`j'] in `i'
...