2013-12-16 4 views
3

매년 다른 변수의 누락 값 (firmage0)을 계산하는 변수 (카운터)를 만들고 싶습니다. 내 코드는 다음과 같습니다.Stata : 계산시 누락 값 무시

sort year 
quietly by year: gen counter = _n if firmage0 != . 

불행히도 Stata는 누락 된 값이 있더라도 1부터 계산하기 시작합니다. 그러나 누락되지 않은 가치가있을 때 계산을 시작하고 싶습니다. 또한 두 번째 비 해독 값은 값 "2", 세 번째 "3"등이되어야합니다. 하나의 중요한 제한이 있습니다. 보존복원을 사용하지 마십시오! 변수 카운터을 만든 후에는 내 데이터 세트가 다음과 같이 표시됩니다 (이는 그 중 일부 임). 여유 공간이란 가치가 없다는 것을 의미합니다!

year firmage0 counter 
1975   
1975   
1975   
1975   
1975 21 5 
1975   
1975 60 7 
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975 115 20 
1975   
1975   
1975 

그러나 데이터 세트는 다음과 같아야는 :

. sort year firmage0 

당신이 당신의 문제가 해결이됩니다

year firmage0 counter 
1975   
1975   
1975   
1975   
1975 21 1 
1975   
1975 60 2 
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975 115 3 
1975   
1975   
1975  

답변

3

시스템 변수 _n는 그것이 독립적으로 if 조건의 현재 관측의 개수를 의미한다는 점에을 고정된다. 코드를 묻는 질문은 이며 의 숫자 값을 취합니다.이 누락되지 않은 경우입니다. 이것은 누락 된 관측치의 수와 당신이 정말로 원하는 어떤 지점까지 다릅니다.

누락의 데이터 유형 에주의하십시오. 제시 할 때 공백은 문자열에 대한 누락이므로 firmage0은 문자열 변수처럼 보입니다. 숫자 값 누락은 이며 . (또는 .<something>)입니다. help missings을 참조하십시오.

하나의 솔루션은 에서 조건부 누적 sum을 수행하고 있습니다. 나는 변수 유형이 숫자 가정

clear all 
set more off 

input year firmage0 
1975  . 
1975  . 
1975  .  
1975  . 
1975 21 
1980 60 
1980 . 
1980 89  
1985  . 
1985  . 
1985 23  
1985 45  
1985 47 
1985  . 
end 

list, sepby(year) 

bysort year: gen counter = sum(!missing(firmage0)) 
replace counter = . if missing(firmage0) // optional 

list, sepby(year) 

!missing(firmage0)는 평가 거짓 (0) 또는 참 (1) firmage0에 대한 관찰 각각 누락 여부에 따라 달라집니다. 그런 다음 sum 누적 합계 않습니다. 변수가 문자열 유형의 사실 인 경우

다음과 해당 행 바꾸

bysort year: gen counter = cond(missing(firmage0), ., sum(!missing(firmage0))) 

하지만 I는 선호 (숫자 타입)

replace counter = "" if missing(firmage0) // optional 

한 라이너 인 첫 번째 방법은 읽기 쉽기 때문입니다.

+0

정말 고마워요! 좋은 대답. –

+0

+1. '형식'의 한 인스턴스를 '저장 유형'으로 수정했습니다. –

1

나는 year으로 정렬하면 경우와 firmage0 앞에 있다고 생각합니다. 숫자를 다시 시작한다는 것을 확인하기 위해 firmage0 값 중 하나의 연도를 변경했습니다.

. by year : gen counter = _n if firmage0 !=. 

year firmage0 counter    
1975 21 1  
1975 60 2 
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1976 115 1 
+1

문자열 형식과 숫자 형식 모두를 일반화하려면'firmage0! = .' 대신'! missing (firmage0)'을 사용하십시오. –

+1

이전의 '정렬'순서가 추가 코드없이 안정적으로 복원되지 않는 한 위험합니다. –