Nano Hash - криптовалюты, майнинг, программирование

Вычислить строковую дробь

Предположим, у меня есть следующий набор данных:

data df;
input frac $;
datalines;
1/3
1/4
5/12
1
0
7/12
;
run;

И я хочу добраться до этого:

frac
0.33
0.25
0.42
1.00
0.00
0.58

Я знаю, что мог бы получить этот вывод, выполнив следующее:

proc sql;
select
  case
    when frac = '1/12' then 0.083
    when frac = '1/6' then 0.167
    ...
  end as frac_as_num
from df
;
quit;

Но я бы предпочел не жестко кодировать все. Я знаю, что мог бы сделать что-то подобное в Python:

frac = ['1/12', '1/6', ...]
[eval(f) for f in frac]
sas
16.11.2018

Ответы:


1

что-то вроде ниже, используя сканирование и ввод, должно работать.

 proc sql;
 create table want as 
 select frac, 
    case when index(frac,'/') then 
    input(scan(frac, 1),best32.)/input(scan(frac, 2),best32.) 
    else input(frac,best32.) end as frac_as_num format= 5.2
from df;
16.11.2018
  • Хорошее использование input(scan , это, вероятно, быстрее, чем переход к макросу для разрешения каждого значения frac 17.11.2018

  • 2

    Вот как я бы сделал это, чтобы результаты были числами и не были преобразованы в символы и из них, что произошло бы, если вы используете %SYSEVALF через RESOLVE за один шаг.

    filename FT76F001 temp;
    data _null_;
       file FT76F001;
       input frac $;
       put +3 'x=' frac ';' frac=$quote. '; output;';
       datalines;
    1/3
    1/4
    5/12
    1
    0
    7/12
    ;
    run;
    
    data frac;
       length x 8 frac $16;
       %inc FT76F001;
       run;
    proc print;
       run;
    

    введите здесь описание изображения

    Это использует SYSEVALF

    464  data _null_;
    465     input frac $;
    466     x = input(resolve(cats('%sysevalf(',frac,')')),f32.);
    467     put 'NOTE: ' (_all_)(=);
    468     datalines;
    
    NOTE: frac=1/3 x=0.3333333333
    NOTE: frac=1/4 x=0.25
    NOTE: frac=5/12 x=0.4166666667
    NOTE: frac=1 x=1
    NOTE: frac=0 x=0
    NOTE: frac=7/12 x=0.5833333333
    
    16.11.2018

    3

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

    Что-то типа:

    data test;
        set df;
    
        call symput('myMacroVariable',frac);            /* Put the value of frac into a macro variable */
        dec = resolve('%sysevalf(&myMacroVariable)');   /* Evaluate the value of the macro variable */
    run;
    

    Редактировать: не слушайте меня, ответ data_null_ делает то же самое, но в одну строку.

    16.11.2018

    4
  • Хороший трюк! coalesce устанавливает знаменатель по умолчанию равным 1, когда frac не имеет своего собственного. Рассмотрите возможность использования формата представления вместо обратного преобразования в строку с put, т. е. fracval = scan(frac,1) / coalesce(scan(frac,2),1); format fracval 4.2;. 17.11.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..