SAS Информат: Что означает 3. информат?

У меня есть приведенный ниже пример кода SAS, который выводит ht2, используя ввод с информацией 3. Насколько я понимаю, ht2 =INPUT(ht,3.) заключается в том, что ht будет выводиться, если он имеет 3 цифры (включая десятичные). Но вместо этого в приведенном ниже коде отсутствуют все элементы ht2.

data left;
    input  name $ ht ;
    datalines;

dick  20.55 

sam  2.5
roger  2 
peter 200 
;
run;

data left2;

set left;
ht2= INPUT(ht,3.);
run;

Вывод SAS left2

| name     | ht   | ht2|
| -------- | ---- | ---| 
| dick     | 20.55| . |
| sam      | 2.5  | . |
| roger    | 2    | . |
| peter    | 200  | . |

Ожидаемый результат left2

| name     | ht   | ht2 |
| -------- | ---- | --- | 
| dick     | 20.55| .   |
| sam      | 2.5  | 2.5 |
| roger    | 2    | 2   |
| peter    | 200  | 200 |


какого типа должен быть ваш ожидаемый результат?

Yjn000 06.06.2024 13:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Согласно документации , input() ожидает, что источником будет

символьная константа, переменная или выражение, к которому вы хотите применить определенную информацию.

Ваша исходная переменная ht не символьная, а числовая. Поэтому вам нужно использовать put() вместо input():

data left2;
    set left;
    ht2 = put(ht, 3.);
run;
name    ht       ht2
--------------------
dick    20.55    21
sam     2.5       3
roger   2         2
peter   200     200

Обратите внимание, что исходные значения, длина которых превышает 3 цифры, включаются в выходные данные для ht2 и округляются в соответствии с новым форматом. Даже многие числа больше 999 можно было бы привести в соответствие с новым форматом путем округления с использованием экспоненциальной записи.

Спасибо за ответ! Извините, я не упомянул ранее, что пытаюсь перекодировать с SAS на Python, и не понимаю, как работает ht2= INPUT(ht,3.). Если INPUT предназначен только для переменной Char, то когда я меняю на ht2= INPUT(ht,8.), почему 20,55 становится 2?

123456 07.06.2024 03:18

@Yjn000: Спасибо за ответ! Можете ли вы помочь в моем вопросе в комментарии выше? Спасибо

123456 07.06.2024 03:19
input(20.55,3.) равен 2, потому что это единственная цифра в первых 8 байтах строки ' 20.55', в которую 20.55 преобразуется по умолчанию BEST12. формат, который SAS будет использовать для преобразования числа в строку, если вы случайно используете число, в котором требуется строка символов.
Tom 07.06.2024 03:39

я бы использовал длину и кошек в этом отношении

data work.have;
    input  name $ ht ;
    datalines;
dick  20.55 
sam  2.5
roger  2 
peter 200 
;
run;

proc sql;
    create table work.result as
        select
            base.*
            ,(case
                when (length(cats(base.ht)) <= 3)
                    then base.ht
                else .
            end)        as 'ht2_asInteger'n
            ,(case
                when (length(cats(base.ht)) <= 3)
                    then cats(base.ht)
                else ''
            end)        as 'ht2_asString'n
        from work.have as base
    ;
quit;
Ответ принят как подходящий

Информация 3. означает преобразование первых трех байтов исходной строки в число.

ИНФОРМАТ преобразует текст в значение. ФОРМАТ преобразует значение в текст.

В вашем коде переменная HT имеет числовой формат, поэтому для использования ее в качестве источника для функции INPUT() SAS придется преобразовать число в строку символов. Когда он выполняет это неявное преобразование, он использует BEST12. формат, который выровняет результат по правому краю.

Значения HT2 отсутствуют, поскольку ни одно из значений HT не было преобразовано в строку символов с использованием BEST12. В первых трех позициях формата было что угодно, кроме пробелов. Для представления большей части вашего значения HT в виде числа требуется очень мало цифр. Даже самое длинное сгенерированное значение (начиная с числа 20,55) будет иметь 7 ведущих пробелов.

Если бы переменная HT в наборе данных LEFT была прочитана как символьная переменная, тогда второй шаг данных для создания LEFT2 имел бы больше смысла. Но ваше первое ожидаемое значение неверно. Потому что чтение первых трех байтов строки «20,55» приведет к числу 20, а не к пропущенному значению. Если вы хотите, чтобы она отсутствовала, вам нужно будет проверить длину строки в HT и запускать функцию INPUT() только тогда, когда длина равна 3 байтам или меньше.

data left;
  input name $ ht $ ;
datalines;
dick  20.55 
sam   2.5
roger 2 
peter 200 
;

data left2;
  set left;
  if length(ht)<4 then ht2= INPUT(ht,3.);
run;

Другие вопросы по теме