Суммирование символов в SAS - PullRequest
0 голосов
/ 29 января 2020

У меня есть (довольно большой) набор данных в SAS, где один из столбцов содержит данные, которые выглядят следующим образом -

Column Name
8    
4    
13    
NA    
NA    
3    
5

et c ..

Из-за NA в столбцах (а их довольно много) SAS распознает весь столбец как содержащий символьные переменные. Однако я хочу выполнить некоторые математические операции над числами в этом столбце, например, SUM, но поскольку SAS не может выполнять функцию SUM для символьных переменных, это оказывается довольно сложным. Есть ли способ заставить SAS считать этот столбец цифрой c?

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Если у вас есть только одно текстовое значение, вы можете использовать TRANWRD, чтобы заменить его на '0' или '.' - в зависимости от того, как вы хотите обработать ваши нулевые значения NA.

ИЛИ ... Если вы хотите удалить все текстовые символы из значений столбца, вы можете использовать функцию COMPRESS с модификатором 'KD' только для «Сохранить цифры». (Полный список модификаторов сжатия можно найти здесь . Они очень полезны при очистке текста).

Затем вы можете «преобразовать» новый столбец в цифру c с помощью применяя к нему множитель *1 или используйте оператор INPUT (pro c sql не понравится работа с множителем * 1).

data your_dataset;
    input text_column $ @@;
    datalines;
8    4    13    NA    NA    3    5
;
run;

/* update dataset to have numeric version of column... */
data updated_dataset;
    set your_dataset;
    num_column1 = tranwrd(upcase(text_column), 'NA', '0') * 1;
    num_column2 = compress(text_column, ,'kd') * 1;
run;

/* ..or leave your dataset unchanged and just show sums using proc sql */
proc sql;
    create table show_sums as
    select   sum(input(tranwrd(upcase(text_column), 'NA', '0'), 8.)) as sum1
            ,sum(input(compress(text_column, ,'kd'), 8.)) as sum2
    from your_dataset
    ;
quit;
0 голосов
/ 29 января 2020

Вы упомянули SUM, так что есть две возможности: SQL SUM для группы агрегирования или SUM statisti c в процедуре SAS, такой как Proc MEANS, SUMMARY, UNIVARIATE, REPORT, TABULATE, et c.

In SQL a SUM вычисленного значения (преобразование из символьного представления числа в число c значение) может быть выполнено напрямую. Предположим, что рассматриваемый столбец имеет имя amount

data have;
length amount $2;
input amount @@; datalines;
8 4 13 NA NA 3 5
;

proc sql;
  create table want as
  select 
    SUM(
      input(amount,?best12.)  /* computed value is conversion through INPUT() */
    ) as amount_total
    %* The ? before the informat (best12.) suppresses log messages such as
    %* NOTE: Invalid string and 
    %* NOTE: Invalid argument;
  from have;

Для других процедур им потребуется источник данных, который доставляет столбец, преобразованный в переменную цифр c или новую переменную цифр c. на основе исходной символьной переменной. Есть два способа предоставить этот источник данных:

  • Как ВИД
  • Как набор ДАННЫХ
* view;
data have_view / view=have_view;
  set have;
  amount_num = input(amount,?best12.);
run;
proc means noprint data=have_view;
  var amount_num;
  output out=want_2 sum=amount_total;
run;

* or data;
data have_num;
  set have;
  amount_num = input(amount,?best12.);
run;
proc means noprint data=have_num;
  var amount_num;
  output out=want_2 sum=amount_total;
run;

См. SAS Pro c Импорт CSV и отсутствующих данных для макроса, который преобразует символьную переменную вместо и не создает новые имена переменных. При таком макросе ненулевые c исходные значения (такие как NA, ??) «теряются», поскольку они становятся пропущенными значениями (.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...