[R] 문자열을 특정 길이로 만들고, 빈 자리는 '0'으로 채우기, 소수점 길이 지정하기 : sprintf {base}
R 분석과 프로그래밍/R 데이터 전처리 2017. 9. 17. 11:50문자열이나 숫자를 특정 형식으로 길이를 지정해주면 데이터를 출력했을 때 깨끗하게 정리가 되어 보이기 때문에 가독성이 좋아집니다.
혹은 데이터가 특정 형식(format)으로 DB에 이미 지정이 되어 있어서 데이터 간 병합이나 join을 하기 위해 특정 형식으로 데이터를 표준화 해주어야 할 경우가 있습니다.
이번 포스팅에서는 {base} package의 sprintf() 함수를 사용해서
- (1) 문자열을 매개변수 width 길이로 만들고, 빈 자리는 '0'으로 채우기 : sprintf("%05d", var)
- (2) 소수점 숫자(numeric)의 자리수를 지정해주기 : sprintf(".5f", var)
하는 방법에 대해서 알아보겠습니다.
이번 포스팅의 함수 sprintf()는 데이터 전처리할 때 종종 사용하는 편이예요.
(1) 문자열을 특정 길이로 만들고, 빈 자리수만큼 '0'을 채우기 : sprintf("%05d", var) |
1자리, 2자리, 3자리, 4자리를 가진 데이터를 가지고 예제로 사용할 간단한 DataFrame을 만들어보겠습니다.
> # making a sample DataFrame > df <- data.frame(var1 = c(1, 11, 111, 1111)) > df var1 1 1 2 11 3 111 4 1111
|
위의 예제 데이터셋을 가지고, 칼럼 var1의 데이터를
- '1 자리수를 가진 문자열'로 만들되, '1자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'
- '2 자리수를 가진 문자열'로 만들되, '2자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'
- '3 자리수를 가진 문자열'로 만들되, '3자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'
- '4 자리수를 가진 문자열'로 만들되, '4자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'
- '5 자리수를 가진 문자열'로 만들되, '5자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'
를 해보겠습니다.
만약 매개변수 자리수보다 데이터의 길이가 더 크다면 '0'이 채워지지는 않습니다. 아래의 예제의 결과를 View(df)로 해서 보면 원래의 변수 var1과 sprintf() 함수를 사용해서 만든 var1_01d 변수의 데이터 출력 형식이 다른 것을 알 수 있습니다.
그리고 class 함수로 데이터 형식을 살펴보니 원래 변수 var1은 숫자형(numeric)이지만 sprintf() 함수로 만든 새로운 변수는 요인형(factor)의 문자열로 바뀌어 있음을 알 수 있습니다.
> #------------------------- > # (1) sprintf(%03d, var) : Format number as fixed width, with leading zeros > df <- transform(df, + var1_01d = sprintf("%01d", var1), + var1_02d = sprintf("%02d", var1), + var1_03d = sprintf("%03d", var1), + var1_04d = sprintf("%04d", var1), + var1_05d = sprintf("%05d", var1)) > > df var1 var1_01d var1_02d var1_03d var1_04d var1_05d 1 1 1 01 001 0001 00001 2 11 11 11 011 0011 00011 3 111 111 111 111 0111 00111 4 1111 1111 1111 1111 1111 01111 > View(df) > sapply(df, class) var1 var1_01d var1_02d var1_03d var1_04d var1_05d "numeric" "factor" "factor" "factor" "factor" "factor" |
(2) 소수점 숫자(numeric)의 자리수를 지정해주기 : sprintf(".5f", var) |
무리수인 자연상수 e의 소수점 10째 자리까지의 수를 대상으로 sprintf("%.5f", e) 함수를 사용해서 소수점의 자리수를 설정해보겠습니다. "%.숫자f"의 숫자 만큼 소수점을 표시해주는데요, 반올림을 해서 표시해줍니다. 아래의 예제를 보시면 금방 이해할 수 있을 것입니다.
> #------------------------- > # (3) sprintf("%.5f", x) : formatting decimal point, > e <- c(2.7182818284) # mathematical constant, the base of the natural logarithm > > sprintf("%.0f", e) [1] "3" > sprintf("%.1f", e) [1] "2.7" > sprintf("%.2f", e) [1] "2.72" > sprintf("%.3f", e) [1] "2.718" > sprintf("%.5f", e) [1] "2.71828" > sprintf("%.10f", e) [1] "2.7182818284"
|
아래의 예시는 sprintf("%숫자.f, e)로 '숫자' 부분에 매개변수로 정수 부분의 자리수를 지정해주는 예시입니다. 소수점의 자리도 모두 포함해서 '숫자' 부분 매개변수만큼의 길이로 표시 형식을 맞추어줍니다.
> e <- c(2.7182818284) # mathematical constant, the base of the natural logarithm > > sprintf("%1.1f", e) [1] "2.7" > sprintf("%2.1f", e) [1] "2.7" > sprintf("%3.1f", e) [1] "2.7" > sprintf("%5.1f", e) [1] " 2.7" > sprintf("%10.1f", e) [1] " 2.7" > |
많은 도움 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^