2014-09-21 85 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