2016-02-27 2 views
0

У меня есть набор данных, в котором у меня есть разные имена в одном столбце, имена могут быть дублированы. Моя задача состоит в том, чтобы сравнить каждое имя с остальными именами в столбце. Например, если я беру имя 1 «Vishal», мне нужно сравнить его со всеми именами от 2 до 13. Если есть совпадение имя из строки 2-13 будет отличаться от столбца «флаг» со значением Y, если существует дубликат, если нет дубликата, тогда значение NI должно выполнить эту операцию со всеми именами в группеЗацикливание в соответствии с дубликатами в SAS

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

data Name; 
input counter name $50.; 
cards; 
1 vishal 
2 swati 
3 sahil 
4 suman 
5 bindu 
6 bindu 
7 vishal 
8 tushar 
9 sahil 
10 swati 
11 gudia 
12 priyansh 
13 priyansh 
; 

proc sql; 
select count(name) into: n from swati; 
quit; 

proc sql; 
select name into: name1 -:name13 from swati; 
quit; 

options mlogic mprint symbolgen; 
%macro swati; 
data name1; 
set swati; 
%do i = 1 %to 1; 
%do j= %eval(&i.+1) %to &n.; 
if &&name&i. =&&name&j. then flag="N"; 
else flag="Y"; 
%end; 
%end; 
run; 
%mend; 
%swati; 
  • код дает мне юдоль N для всех имен, даже если есть соответствие имени, также делает другую переменную с используя все имена переменных. *

  • Требуемый выход показан ниже

    Название флага
    Вишал N
    Свази N
    SAHIL N
    Suman Y
    бинду N
    бинду Y
    vishal Y
    tushar Y
    sahil Y
    Свати Y
    gudia Y
    priyansh N
    priyansh Y

  • Поэтому в основном мы начали находить Вишал (первое имя) от 2 до 13 лет и посмотреть, если есть дубликат, если есть флаг N т.е. есть дубликат. Давайте посмотрим имя «Суман», которое является четвертым именем в списке, и мы начинаем искать его соответствие от 5 до 13. Поскольку для этого нет дубликата, мы отметили его как «Y».

Мы должны сделать это с помощью DO LOOP

+0

Разве вы не просто спрашиваете, является ли NAME одинаковым значением для каждой записи? – Tom

+0

Предложите, чтобы вы отображали желаемые выходные данные при обработке показанных 13 записей. – Quentin

+0

Ты слишком много работаешь. Посмотрите сортировку proc и дубликаты. Или BY обрабатывается в SAS. – Reeza

ответ

2
  1. Сортировать данные по имени
  2. Используйте шаг данных с ВУ для выявления дубликатов
  3. Резорт приказом при желании

    proc sort data=name; 
    by name; 
    run; 
    
    data want; 
    set name; 
    by name; 
    if first.name and last.name then unique='Y'; 
    else unique='N'; 
    run; 
    
    proc sort data=want; 
    by counter; 
    run; 
    
0

Ваш ответ на последнее наблюдение не выглядит правильным. Есть ли другое условие, что если это последняя запись, флаг должен быть «N» вместо «Y»?

Я действительно не вижу причин, почему вы должны использовать цикл DO. Но вы можете разместить цикл DO вокруг инструкции SET с опцией POINT = для поиска совпадающих имен.

data want ; 
    set name nobs=nobs ; 
    length next $50; 
    next=' '; 
    do p=_n_+1 to nobs until (next=name) ; 
    set name(keep=name rename=(name=next)) point=p; 
    end; 
    if next=name then flag='N'; else flag='Y'; 
    drop next; 
run; 

Вы также можете воспользоваться переменным СЧЕТЧИКОМ и сделать это с помощью GROUP BY в SELECT заявления в PROC SQL.

proc sql ; 
    create table want2 as 
    select * 
     , case when (counter = max(counter)) then 'Y' else 'N' end as flag 
    from name 
    group by name 
    order by counter 
    ; 
quit; 
+0

@tom ... Да, мои извинения, но последняя запись должна была быть «Y» вместо «N» –

+0

@tom ... Спасибо, что так много. Я действительно борюсь с этим кодом и, наконец, получил ответ. Еще раз спасибо. :) –

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