2017-04-20 3 views
1

매우 긴 상품명 (var1) 목록으로 작업하고 있습니다. 이 목록에서 var1에 특정 키워드가 포함되어 있으면 1과 같은 두 번째 변수 (var2)를 만들어 정보를 추출하고 싶습니다.로컬 목록으로 문자열 변수를 검색하는 루핑

나는 다음과 같은 코드를 사용했다

:

g soy = strpos(productsproduced, "Soybeans, ") | strpos(productsproduced, "Soybean, ") | strpos(productsproduced, "soybeans, ")| strpos(productsproduced, "soybean, ") | productsproduced == "Soybeans" 

목록은 더 이상 주어진 데이터가 제대로 코딩되지 않은 것을, 각각의 이름은 코드 샘플 프로그램에서 발췌으로 (여러 가지 방법으로 나타납니다).

는 나는 (확실히 목록을보고 쉽게, 그리고 등, 무엇을 놓치고 있는지) 목록 작업

불행하게도, 그것은 내가 이후 잠시왔다 훨씬 쉬울 것이라고 생각 루프와 함께 일했다,하지만 난 종류의 일을 생각했다 :

local mylist Soybean soybean Soybeans soybeans Soybeans, soybeans, 
forval i = mylist { 
g soy = strpos(var1, "`i'") 
} 

이 꽤 작업을 수행하지만, 내가 그것을 코딩하는 방법을 모르겠습니다. 한 가지 확실한 문제는 Stata가이 연산자에서 or 연산자 (예, 나) 또는 연산자를 사용할지 여부를 알 수 없다는 것입니다.

답변

3

정신은 분명합니다. 세부 사항에는 다양한 수정이 필요합니다.

local mywords Soybean soybean Soybeans soybeans Soybeans, soybeans, 
gen soy = 0 
foreach w of local mywords { 
    replace soy = soy | strpos(var1, "`w'") 
} 

중요한 것은 루프 내에 replace이 필요하다는 것입니다. 그렇지 않으면 변수가 이미 존재하므로 generate에서 두 번째 순환이 실패합니다.

는 사실이 예제는 oybean가 원하지 않는 아무것도 일치하지 않을 것이라고 가정

gen soy = strpos(var1, "oybean") > 0 

을 줄일 수 있습니다. 소문자로 표준화

local mywords soybean soybeans soybeans, 
gen soy = 0 
foreach w of local mywords { 
    replace soy = soy | strpos(lower(var1), "`w'") 
} 
+0

닉 콕스 종종 도움이됩니다 : 당신의 도움을 주셔서 감사합니다. 이것은 완벽하게 작동하고 많은 시간을 절약 할 것입니다. 태그 할 수없는 것 같지만 문자열의 섹션을 피하기 위해 어떤 지침이 있습니까? 당신이 말했듯이, "gen soy = strpos (var1,"oybean ")> 0은 oybean이 내가 원하지 않는 어떤 것과도 일치하지 않는다고 가정합니다."fancy soybeans "문자열이 나에게 관심이 없다면 어떨까요? "보통의 콩"때문에 "공상적인 콩과 콩"에 관심이있는 문자열입니까? – Nox

+1

한 가지 방법은 문자열에서 '공상 콩'을 제거하면 남은 것을 확인하는 것입니다. 변수를 변경하고'subinstr (var1, "fancy soybeans", "",.)'에 대해 작업하십시오. –