SAS中的数字字符

时间:2014-09-21 09:25:11

标签: sas

我是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。如何解决?

感谢任何帮助。

2 个答案:

答案 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;