我是新来的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.如何解决它?
任何帮助表示赞赏。
我是新来的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.如何解决它?
任何帮助表示赞赏。
有可能是一种方法来创建一个自定义的信息来处理这个问题,我希望乔或其他常客在这里可以建议你。然而,做不到这一点,这里有一个基于函数的方法:从性格
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;
转换为数字通常是使用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;
有没有一种真正的方法来制作自定义信息。不幸的是,图片信息是不可能的。在这种情况下,压缩是最好的方法。 – Joe 2014-09-21 17:25:05
我尝试了输入/压缩选项,它工作。但非常感谢您的回答。 – Natalia 2014-09-22 18:50:59