[R] 지수표기을 숫자표기로 바꾸는 R 옵션, options(scipen=100), format(scientific=FALSE)
R 분석과 프로그래밍/R 데이터 전처리 2016. 7. 9. 21:37큰 자리수의 숫자를 불러오기하면 지수 표기법(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) 이라고 해도 동일하게 지수형태로 표기될겁니다)
|
이걸 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" |
많은 도움 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꼬옥 눌러주세요.