2014-09-21 3 views
1

나는 sas를 처음 사용하며 다음과 같은 문제가 있습니다.SAS에서 숫자로 문자

나는 시간을 저장하지만 문자 인 $ 50 형식의 변수가 있습니다. 30 분, 1.5 시간, 5 시간, 10 시간처럼 보입니다. 숫자로 변환하고 시간을 계산해야합니다. 나는 숫자를 추출하기 위해 substrn 함수를 시도했다. 그러나 substrn (var, 1,2)은 30, 1.5 (1.5 대신), 5, 10 및 substrn (var, 1,3)은 30, 1.5,. (5 대신)을 제공합니다.

도움을 주시면 감사하겠습니다.

답변

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

사용자 정의 정보를 작성하는 좋은 방법은 없습니다. 불행히도 그림 정보는 불가능합니다. 이 경우 압축하는 것이 가장 좋은 방법입니다. – Joe

+0

입력/압축 옵션을 시도했는데 성공했습니다. 그러나 응답을위한 많은 감사합니다. – Natalia

3

변환은 일반적으로 input 기능을 사용하여 수행됩니다. 두 번째 인수는 예상되는 informat (SAS에 입력 해석 방법을 알려주는 규칙)을 전달합니다.

함수 (문자를 버리지 않고 "k"옵션 사용)를 사용하여 문자 변수의 숫자 부분 만 얻을 수 있습니다. 압축은 값에서 특정 문자를 제거합니다. 첫 번째 인수는 작업 할 문자열을 전달하고 두 번째 인수는 제거 할 문자를 나열하며 세 번째 인수는 추가 옵션을 전달합니다 (여기서 "d"는 제거 할 문자 목록에 숫자를 추가하고 "k"는 프로세스를 반전합니다). 즉 선택한 문자를 제거하지 말라.

그리고 index 함수는 문자열에 "m"이 포함 된 시간을 식별하는 데 사용할 수 있습니다. Index는 입력 내에서 검색 문자열이 처음 나타나는 위치를 반환합니다. 입력에 "m"이 없으면 if 문에서 0을 반환하고 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 min"인덱스가 반환되었을 때입니다. 그래서 index gt 0 then newtime = ... 조건을 추가하면 작동했습니다. – Natalia

+0

그것이 효과적이기 때문에 기쁘다. 그러나 당신의 변화는 필요하지 않아야했다. SAS는'0' 및'.' (누락)을 false로 평가하고 다른 모든 숫자 값은 true로 평가됩니다. – SRSwift

관련 문제