큰 자리수의 숫자를 불러오기하면 지수 표기법(exponential notation, scientific notation)으로 되어 있어서 읽기가 힘든 경우가 있습니다.

 

가령 '900000' 이라는 숫자를 R에서 읽어들였더니 '9e+5'라고 쓰여있다면 좀 어색하지요? 

 

이럴 경우 '9e+5'라고 프린트되어 있는 표기를 '900000'처럼 고정형 숫자 표기법(fixed notation)으로 바꿔주고 싶을 때 R에서 사용하는 방법 2가지를 소개하고자 합니다.

 

(1) 하나는 전역적으로(global environment) 영향을 미치는 옵션으로 : options(scipen = xxx) 이구요,

 

(2) 또 하나는 국소적으로(local) 특정 변수에 대해서 설정을 하는 옵션으로 : format(var, scientific = FALSE)

 

입니다.

 

아주 간단한 예를 들어서 설명을 해보겠습니다.

 

 

 

 

가령, "2016년 7월 9일 10시 30분 50초"의 시간을 나타내는 숫자가 "20160709103050" 처럼 입력되어 있는 데이터가 있다고 칩시다.  이를 options("scipen" = -100) 또는 options(scipen = -100)인 상태에서 입력을 받고서 프린트를 해보면 "2.016071e+13" 이라고 나옵니다.

(괄호 안의 숫자는 충분히 큰 숫자를 써주면 됩니다. options("scipen" = -30) 이라고 해도 동일하게 지수형태로 표기될겁니다)

 

 

> ################################################# > ## changing from exponential to numeric notation > ## options("scipen" = 100) > ## format(df$var, scientific = FALSE) > ################################################# >

> options("scipen" = -100)
> number <- c(20160709103050)
> number
[1] 2.016071e+13
> str(number)
 num 2.02e+13

 

 

 

이걸 options("scipen" = 100) 또는 options(scipen = 100)이라고 하고 다시 number를 프린트해보면 아래처럼 "20160709103050" 으로 원하는 형태로 잘 나옵니다. (괄호 안의 숫자는 충분히 큰 숫자를 써주면 됩니다.)

 

이 옵션은 R 사용환경 전체에 영향을 미칩니다.  즉, 특정 변수는 지수형 표기, 특정 변수는 숫자표기로 할 수는 없다는 뜻입니다.

 

> options("scipen" = 100)
> number
[1] 20160709103050 

 

 

참고로, options(scipen = x) 의 default 값은 '0' 입니다.

 

 

날짜/시간 얘기가 나온 김에 조금 더 진도를 나가 보자면요,

시계열분석이나 년/월/일/시간/분/초 단위로 구분해서 연산을 해야 하는 경우에 as.POSIXlt() 함수로 날짜/시간 type으로 바꾸어주면 편합니다. 

 

아래에 as.POSIXlt로 숫자형 number를 날짜/시간 유형으로 바꿔보려고 했더니 "NA" 값이 나오네요. 

 

> datetime_1 <- as.POSIXlt(number, # numeric
+                          format = '%Y%m%d%H%M%S', 
+                          origin = "1970-01-01", 
+                          tz ="UTC")
> 
> datetime_1 # NA
[1] NA

 

 

 

 

이럴경우 특정 변수만 format(var, scientific = FALSE) 옵션을 사용해서 포맷을 바꾸어주면 numeric이었던 것이 character로 바뀌었고, 큰 따옴표도 생겼습니다.

 

> # scientific = FALSE
> number_2 <- format(number, scientific = FALSE)
> number_2
[1] "20160709103050"
> str(number_2)
 chr "20160709103050"

 

 

 

 

이렇게 문자형으로 바꾸고 나서 다시 as.POSIXlt(char_var, format = '%Y%m%d%H%M%S', origin="1970-01-01", tz = UTC) 로 날짜/시간 유형으로 변환하면 잘 작동하네요.

 

> datetime_2 <- as.POSIXlt(number_2, # character
+                          format = '%Y%m%d%H%M%S', 
+                          origin = "1970-01-01", 
+                          tz ="UTC") # UTC : universal time
> 
> datetime_2 # "2016-07-09 10:30:50 UTC"
[1] "2016-07-09 10:30:50 UTC"

 

 

 

 

format() 대신에 as.character(numeric_var) 를 사용해서 숫자형을 문자형으로 바꾸어주고 나서, as.POSIXlt(char_var, format = '%Y%m%d%H%M%S', origin="1970-01-01", tz = UTC) 로 날짜/시간 유형으로 변환해도 똑같이 잘 작동합니다.

 

> # as.character
> number_3 <- as.character(number)
> number_3
[1] "20160709103050"
> str(number_3)
 chr "20160709103050"
> 
> datetime_3 <- as.POSIXlt(number_3, # character
+                          format = '%Y%m%d%H%M%S', 
+                          origin = "1970-01-01", 
+                          tz ="UTC") # UTC : universal time
> 
> datetime_3 # "2016-07-09 10:30:50 UTC"
[1] "2016-07-09 10:30:50 UTC" 

 

 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꼬옥 눌러주세요.

 

 

Posted by R Friend R_Friend