SAS Retain не работает для 1 строковой переменной - PullRequest
0 голосов
/ 19 сентября 2018

Приведенный ниже код не работает для переменной all_s, когда имеется более 1 записи с одинаковым urn.Var1,2,3 работают нормально, но это не так, и я не могу понять, почему.Я пытаюсь объединить all_s, равный single_var1,2,3, без пробелов, если это first.urn, но я хочу, чтобы оно было

all_s = all_s + ',' + single_var1 + single_var2 + single_var3

когда это не первый экземпляр этой урны.

data dataset_2;
    set dataset_1;
    by URN;
    retain count var1 var2 var3 all_s;
    format var1 $40. var2 $40. var3 $40. all_s $50.;
    if first.urn then do;
        count=0;
        var1 = ' ';
        var2 = ' ';
        var3 = ' ';
        all_s = ' ';
    end;
    var1 = catx(',',var1,single_var1);
    var2 = catx(',',var2,single_var2);
    var3 = catx(',',var3,single_var3);

    all_s = cat(all_s,',',single_var1,single_var2,single_var3);

    count = count+1;
    if first.urn then do;
        all_s = cat(single_var1,single_var2,single_var3);
    end;
run;

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

all_s недостаточно велик, чтобы вместить конкатенацию, если общая длина значений var1-var3 в группе превышает $50.Такой сценарий кажется вероятным, когда var1-var3 равен $40.

Я рекомендую использовать функцию length для указания переменных длин.format создаст переменную определенной длины в качестве побочного эффекта.

catx удаляет пустые аргументы из конкатенации, поэтому, если вам нужны пробелы в конкатенации, когда у вас есть пустой single_varN, вы выиграли 'не может использовать catx

Требование, которое определяет конкатенацию, при которой непустые значения отбрасываются, а пустые значения - это один пустой пробел, скорее всего, придется прибегнуть к подходу старой школы trim(left(…

Пример кода

data have;
  length group 8 v1-v3 $5;
  input group (v1-v3) (&);
datalines;
1  111  222  333
1  .    444  555
1  .    .    666
1  .    .    .
1  777  888  999
2  .    .    .
2  .    b    c
2  x    .    z
run;

data want(keep=group vlist: all_list);
  length group 8 vlist1-vlist3 $40 all_list $50;
  length comma1-comma3 comma $2;

  do until (last.group);
    set have;
    by group;

    vlist1 = trim(vlist1)||trim(comma1)||trim(left(v1));
    vlist2 = trim(vlist2)||trim(comma2)||trim(left(v2));
    vlist3 = trim(vlist3)||trim(comma3)||trim(left(v3));

    comma1 = ifc(missing(v1), ' ,', ',');
    comma2 = ifc(missing(v2), ' ,', ',');
    comma3 = ifc(missing(v3), ' ,', ',');

    all_list = 
      trim(all_list)
      || trim(comma)
      || trim(left(v1))
      || ','
      || trim(left(v2))
      || ','
      || trim(left(v3))
    ;

    comma = ifc(missing(v3),' ,',',');
  end;
run;

Ссылка

SAS имеет операторы и несколько функций для объединения строк

  • || объединить
  • cat объединить
  • catt объединить, обрезать (удалить конечные пробелы) каждого аргумента
  • cats объединить, удалить (удалить начальные и конечные пробелы) каждого аргумента
  • catx объединить, удалить каждый аргумент и разделить
  • catq объединить с аргументами-разделителями и заключить в кавычки аргументы, содержащие разделитель

Из Документация SAS 9.2

Сравнения

Результаты функций CAT, CATS, CATT и CATXобычно эквивалентны результатам, которые получены определенными комбинациями оператора конкатенации (||) и функций TRIM и LEFT.Однако длина по умолчанию для функций CAT, CATS, CATT и CATX отличается от длины, получаемой при использовании оператора конкатенации.Для получения дополнительной информации см. Длина возвращаемой переменной .

Примечание: В случае переменных, у которых отсутствуют значения, конкатенация дает разные результаты.См. Объединение строк с отсутствующими значениями .

0 голосов
/ 19 сентября 2018

Некоторые примеры данных были бы полезны, но я собираюсь дать им шанс и попросить вас попробовать

all_s = cat(strip(All_s),',',single_var1,single_var2,single_var3);
...