У меня есть приведенный ниже пример кода 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 |
Согласно документации , 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?
@Yjn000: Спасибо за ответ! Можете ли вы помочь в моем вопросе в комментарии выше? Спасибо
input(20.55,3.)
равен 2, потому что это единственная цифра в первых 8 байтах строки ' 20.55'
, в которую 20.55
преобразуется по умолчанию BEST12. формат, который SAS будет использовать для преобразования числа в строку, если вы случайно используете число, в котором требуется строка символов.
я бы использовал длину и кошек в этом отношении
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;
какого типа должен быть ваш ожидаемый результат?