我是sas的新手,我有以下问题。
我有一个存储时间但是字符的变量,格式为50美元。它看起来像30分钟,1.5小时,5小时,10小时。我需要将其转换为数字并以小时计算时间。我尝试使用substrn函数来提取数字。但是substrn(var,1,2)给出30,1(而不是1.5),5,10和substrn(var,1,3)给出30,1.5 ,.(而不是5),10。如何解决?
感谢任何帮助。
答案 0 :(得分:3)
通常使用input
函数将字符转换为数字。第二个参数传递了预期的informat(一条告诉SAS如何解释输入的规则)。
您可以使用compress
函数(使用" k"选项保留而不是丢弃字符)来获取字符变量的数字部分。压缩将从值中删除某些字符;第一个参数传递字符串使其工作,第二个参数列出要删除的字符,第三个参数传递其他选项(此处" d"将数字添加到要删除的字符列表和&# 34; k"反转过程。即保留而不是删除所选字符。
并且,index
函数可用于标识字符串包含" m"几分钟。索引将返回输入中搜索字符串第一次出现的位置。如果输入不包含" m"它将返回0并在if语句中评估为FALSE。
/* Create some input data */
data temp;
input time : $20.;
datalines;
1.5h
30min
120min
4.25hour
;
run;
data temp2;
set temp;
/* Extract only the numeric part of the string and convert to numeric */
newTime = input(compress(time, ".","dk"), best9.);
/* Check if the string contains the letter "m" and if so divide by 60 */
if index(time, "m") then newTime = newTime / 60;
run;
proc print;
run;
答案 1 :(得分:0)
可能有一种方法可以创建一个可以处理此问题的自定义信息,我希望Joe或其他常客可以为您提供建议。但是,如果不这样做,这是一个基于功能的方法:
data have;
input time_raw $1-50;
cards;
30 min
1.5 h
5 h
10 h
;
run;
data want;
set have;
if index(time_raw, 'min') then do;
minutes = input(substr(time_raw,1,length(time_raw) - 4), 8.);
hours = 0;
end;
else do;
hours = input(substr(time_raw, 1, length(time_raw) - 2), 8.);
minutes = 0;
end;
format time time.;
time = hms(hours, minutes, 0);
run;