2015-05-10 5 views
0

Ищете способы подсчета различных записей по нескольким столбцам/переменным с помощью PROC SQL, все, что я нахожу, это то, как считать комбинациями значений. Однако я хотел бы выполнить поиск по 2 (символьным) столбцам (внутри строк, удовлетворяющих определенному условию) и подсчитать количество различных значений, которые отображаются в любым из двух.PROC SQL - подсчет различных значений для переменных

Рассмотрим набор данных, который выглядит следующим образом:

DATA have; 
INPUT  A_ID C C_ID1 $ C_ID2 $; 
DATALINES; 
      1  1 abc   . 
      2  0 .   . 
      3  1 efg   abc 
      4  0 .   . 
      5  1 abc   kli 
      6  1 hij   . 
; 
RUN; 

теперь я хочу, чтобы иметь таблицу, содержащую подсчет пг. уникальных значений в пределах C_ID1 и C_ID2 в строках, где C = 1. Результат должен быть 4 (ABC, EFG, Hij, кли):

nr_distinct_C_IDs 
4 

До сих пор я только был может обрабатывать один столбец (C_ID1):

PROC SQL; 
    CREATE TABLE try AS 
      SELECT 
     COUNT (DISTINCT 
      (CASE WHEN C=1 THEN C_ID1 ELSE ' ' END)) AS nr_distinct_C_IDs 
       FROM have; 
QUIT; 

(Обратите внимание, что я использую обработку сЛУЧАЯ вместо ИНЕК, так как мой фактический PROC SQL также обрабатывает другие случаи в пределах того же дия гу).

Это дает мне:

nr_distinct_C_IDs 
3 

Как я могу продлить это до двух переменных (C_ID1 и C_ID2 в моем примере)?

ответ

0

Трудно распространить это на две или более переменных с помощью вашего метода. Сначала попытайтесь скомпилировать переменные, а затем подсчитайте отличное значение. Как это:

proc sql; 
    create table want as 
    select count(ID) as nr_distinct_C_IDs from 
     (select C_ID1 as ID from have 
     union 
     select C_ID2 as ID from have) 
    where not missing(ID); 
quit; 
0

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

data _null_; 
    length ID $3; 
    declare hash h(); 
    rc = h.definekey('ID'); 
    rc = h.definedone(); 
    array IDs $ C_ID1-C_ID2; 
    do until(eof); 
     set have(where = (C = 1)) end = eof; 
     do i = 1 to dim(IDs); 
      if not(missing(IDs[i])) then do; 
       ID = IDs[i]; 
       rc = h.add(); 
       if rc = 0 then COUNT + 1; 
      end; 
     end; 
    end; 
    put "Total distinct values found: " COUNT; 
run; 

Все, что нужно сделать здесь, чтобы разместить дополнительную переменную, - это добавить ее в массив.

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

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