2014-09-21 89 views
1

我是新来的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.如何解决它?

任何帮助表示赞赏。

回答

0

有可能是一种方法来创建一个自定义的信息来处理这个问题,我希望乔或其他常客在这里可以建议你。然而,做不到这一点,这里有一个基于函数的方法:从性格

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; 
+0

有没有一种真正的方法来制作自定义信息。不幸的是,图片信息是不可能的。在这种情况下,压缩是最好的方法。 – Joe 2014-09-21 17:25:05

+0

我尝试了输入/压缩选项,它工作。但非常感谢您的回答。 – Natalia 2014-09-22 18:50:59

3

转换为数字通常是使用input函数来完成。第二个参数传递预期的informat(告诉SAS如何解释输入的规则)。

您可以使用compress函数(使用“k”选项来保留而不是放弃字符)来获取字符变量的数字部分。压缩将从一个值中删除某些字符;第一个参数传递要处理的字符串,第二个参数列出要删除的字符,第三个参数传递附加选项(这里“d”将数字添加到要删除的字符列表中,“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; 
+0

非常感谢!很有帮助。有效。唯一的问题是,索引返回一个字母的位置,在我的情况下,当var =“20分钟”索引返回4.所以我添加了条件,如果索引gt 0然后newtime = ...,它的工作。 – Natalia 2014-09-22 18:55:24

+0

我很高兴它的工作,但你的改变不应该是必要的。 SAS将“0”和“。”(缺失)评估为false,所有其他数值评估为true。 – SRSwift 2014-09-25 17:39:27