2016-11-14 5 views
2

У меня есть следующий код. Я пытаюсь проверить абзац (descr) для списка ключевых слов (key_words). Когда я выполняю этот код, журнал читает все переменные для массива, но будет проверять только 2 из 20 000 строк в цикле do (делать i = от 1 до 100 и далее). Любые предложения по устранению этой проблемы?SAS Do Loop пропускает строки в обработке

data JE.KeywordMatchTemp1; 
    set JE.JEMasterTemp end=eof; 
    if _n_ = 1 then do i = 1 by 1 until (eof); 
    set JE.KeyWords; 
    array keywords[100] $30 _temporary_; 
    keywords[i] = Key_Words; 
    end; 
    match = 0; 
    do i = 1 to 100; 
    if index(descr, keywords[i]) then match = 1; 
    end; 
    drop i; 
run; 

ответ

1

Ваша проблема в том, что ваш end=eof находится не в том месте.

Это тривиальный пример расчета «ранга» возрастного значения для каждого респондента SASHELP.CLASS.

Просмотреть, где я разместил end=eof. Это потому, что вам нужно использовать его для управления операцией заполнения массива. В противном случае, ваш цикл, который равен do i = 1 to eof;, на самом деле не делает то, что вы говорите, он должен: он на самом деле не заканчивается на eof, так как это никогда не является истинным (как определено в в начале). Вместо этого он заканчивается, потому что вы выходите за пределы набора данных, чего конкретно вы не хотите.

Это то, что делает end=eof: это мешает вам пытаться вытащить строку, когда набор данных заполнения массива закончен, что завершает весь шаг данных. Каждый раз, когда вы видите, что шаг данных заканчивается после ровно 2 итераций, вы можете быть уверены, что проблема в том, что это может быть проблемой - это очень распространенная проблема.

data class_ranks; 
    set sashelp.class; *This dataset you are okay iterating over until the end of the dataset and then quitting the data step, like a normal data step.; 
    array ages[19] _temporary_; 
    if _n_=1 then do; 
    do _i = 1 by 1 until (eof); *iterate until the end of the *second* set statement; 
     set sashelp.class end=eof; *see here? This eof is telling this loop when to stop. It is okay that it is not created until after the loop is.; 
     ages[_i] = age; 
    end; 
    call sortn(of ages[*]); *ordering the ages loaded by number so they are in proper order for doing the trivial rank task; 
    end; 
    age_rank = whichn(age,of ages[*]); *determine where in the list the age falls. For a real version of this task you would have to check whether this ever happens, and if not you would have to have logic to find the nearest point or whatnot.; 
run; 
+0

Спасибо! Еще одно, если можно. Кажется, что DO-LOOP у меня во второй части кода не останавливается, когда выполняется условие. Любая причина, которая может произойти? –

+0

Не останавливается, когда 'i = 100'? Или не останавливается, когда 'match = 1'? Последний не собирается останавливать его, зачем? – Joe

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