2015-03-27 2 views
0

Скажем, у меня есть эти данные:Как добавить по столбцам

clear 
set more off 

input /// 
str15(s1 s2 s3 s4) 
a "b" "b" "c" 
b "b" "" "a" 
c "c" "" "" 
d "f" "" "g" 
e "" "" "" 
end 

Я хочу, чтобы найти количество не пропущенных значений по столбцам по строке. Я стараюсь:

gen sum = s1!="" + s2!="" + s3!="" + s4!="" 

Но это дает ошибку несоответствия типа. Что я делаю не так?

Однако, я могу написать все это, и она работает:

gen x=s1!="" 
gen y=s2!="" 
gen z=s3!="" 
gen q=s4!="" 
gen sum1=x + y + z + q 
+1

Проверьте функцию 'egen'' rownonmiss() '. Запустите 'help egen'. –

ответ

4

Проблема заключается в приоритете оператора. Следующие работы:

gen sum = (s1!="") + (s2!="") + (s3!="") + (s4!="") 

От пользователя Stata Руководство

Порядок оценки (от первого до последнего) всех операторов! (или ~), ^, - (отрицание), /, *, - (вычитание), +,! = (или ~ =),>, <, < =,> =, ==, & и |.

Однако я предпочитаю рекомендации Роберто и Димитрия rownonmiss.

2

Я считаю, что вы хотите что-то вроде этого:

gen sum2 = !missing(s1) + !missing(s2) + !missing(s3) + !missing(s4) 

или даже что-то более компактное:

egen sum3 = rownonmiss(s1 s2 s3 s4), strok 

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

Однако у меня нет хорошей интуиции, почему ваш код не работает со строками. Кажется, он работает с числовыми переменными.

Смежные вопросы