2009-05-11 4 views
0

У меня есть ситуация, когда для каждого уникального наблюдения casenum я хотел бы запускать различные запросы и арифметические операции между различными наблюдениями «кода» для этого «casenum» (см. Ниже). Например, для casenum 1234567 я хотел бы вычесть данные для кода 0200 - код 0234 или 531 - 53. Имейте в виду, что в этом наборе данных есть тысячи наблюдений. Есть ли простой способ сделать это или провести сравнение строк с конкретным.Сравнение строк и запросов SAS? или другое решение. Я в тупике

Пожалуйста, обратите внимание casenum и код символьные переменные и данные числовая переменная

Вот пример того, как структурирована набор данных:

 
casenum code data 

1234567
1234567 0234 53 
1234567 0100 789 
1234567 0200 531 
1234567 0300 354 
1111112
1111112 0234 78 
1111112 0100 77 
1111112 0200 7954 
1111112 0300 35 

Вот логика, хотя вероятно, синтаксически неверно из того, что я пытаюсь сделать.

Для кодовых наблюдений, где casenum то же самое, в этом casenums
Я хотел бы, чтобы это определить, если данные для кода 0234 + данные для кода 0100 - данные для кодап данных для кода 0200 then newvariable = 'YES'

Другими словами, я бы хотел, чтобы это проверило, если 53 + 789 - 4597 ne 531. после этого и других подобных видов тестов, выполняемых внутри casenum 1234567, мне бы хотелось чтобы перейти на следующий казен, и запустить те же тесты для этого casenum.

Имейте в виду, что этот набор данных содержит сотни тысяч наблюдений.

ответ

1

Я не понимаю, какова ваша логика для части вычитания кода, но для выбора группы строк, которую я могу предложить. На первый взгляд я бы получил список различных значений для casenum.

proc sql; 
select distinct casenum 
into :casenum_list separated by ' ' 
from dataset; 
quit; 

Теперь, когда у вас есть список всех различных значений casenum, я бы перебирать строки следующего любую логики вам нужно.

Возможно, используя другой ргос SQL, как:

%MACRO DOIT; 
%LET COUNT=1; 
%DO %UNTIL (%SCAN(&casenum_list,&COUNT) EQ); 

%LET CASENUM_VAR=%SCAN(&casenum_list,&COUNT); 

PROC SQL; 
SELECT 
<INSERT SOME SQL LOGIC HERE> 
FROM 
DATASET 
WHERE CASENUM=&CASENUM_VAR; 
QUIT; 

%LET COUNT=%EVAL(&COUNT+1);   

%MEND DOIT; 

%DOIT; 

Я надеюсь, что это помогает. Если вы можете лучше понять, что вы пытаетесь выполнить в рядах, я могу быть более конкретным.

0

Я не думаю, что у меня действительно есть информация из вашего вопроса, чтобы помочь, но я просто выброшу это ... Если вы хотите сделать сравнение строк, вы также можете использовать шаг данных. Предполагая, что ваши данные отсортированы по casenum, вы можете использовать в первую очередь. и последний. чтобы определить, когда у вас новый случай и когда вы находитесь в последнем ряду казена. Если вы хотите суммировать значения данных между строками или принимать решения, основанные на предыдущей строке для казена, перечисленные несколько раз.

Data work.temp ; 
retain casenum_data ; 

set lib.data ; 
by casenum ; 

if first.casenum then do ; 
    /* <reset hold vars> */ 
    casenum_data = 0 ; 
end ; 

if code = "0200" or code = "234" then ..... 


if last.casenum then do ; 
    /* output casenum summary */ 
    output ; 
end ; 

run ; 

Опубликовать больше информации о необходимости и дополнительной помощи.

1

Если формула исправлена ​​(как кажется, как кажется вашему примеру), то не должно быть причин, по которым вы не можете выполнить простой транспонирование, а затем явно объявить тест.

/* Transpose the data by casenum */  
proc transpose data=so846572 out=transpose_ds; 
    id code; 
    var data; 
    by casenum; 
run; 

/* Now just explicitly write your conditional expression */ 
data StackOverflow; 
    set transpose_ds; 

    if _0234 + _0100 - _<> _0200 then newvariable="yes"; 
run; 

Где so846572 = Ваш исходный набор данных, transpose_ds = Транспозиция версия, StackOverflow = конечный результат.

Сообщите нам, если это выражение должно быть динамическим по какой-либо причине. Это должно легко масштабироваться до объема данных, о которых вы упомянули, без каких-либо проблем. Вы могли бы сделать то же самое с хешем, за один проход данных.